Android 10:无法在 IntentService 中使用 openFileDescriptor

Posted

技术标签:

【中文标题】Android 10:无法在 IntentService 中使用 openFileDescriptor【英文标题】:Android 10 : Not able to use openFileDescriptor inside IntentService 【发布时间】:2020-08-01 00:42:36 【问题描述】:

我需要通过我们的应用上传用户选择的附件。当在接受用户选择的 URI 的 Activity 中调用上传时,上传工作。但是当我将 URI 传递给 IntentService 以便可以在后台上传一个巨大的附件时,我在下一行的 IntentService 中收到“Permission Denial”异常 -

final Uri uri = intent.getData();
//This line works within Activity but throws "Permission Denial" exception in IntentService
ParcelFileDescriptor inputPFD = getContentResolver().openFileDescriptor(uri, "r");

FileDescriptor fd = inputPFD.getFileDescriptor();
final FileInputStream fileInputStream = new FileInputStream(fd);
int bytesAvailable = fileInputStream.available();

Stacktrace
-----------
java.lang.SecurityException: Permission Denial: opening provider com.android.externalstorage.ExternalStorageProvider from ProcessRecord6148698 8180:com.<package name>/u0a140 (pid=8180, uid=10140) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
at android.os.Parcel.createException(Parcel.java:2071)
at android.os.Parcel.readException(Parcel.java:2039)
at android.os.Parcel.readException(Parcel.java:1987)
at android.app.IActivityManager$Stub$Proxy.getContentProvider(IActivityManager.java:5054)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:6561)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2725)
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:2117)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1671)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1503)
at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:1338)
at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:1286)

请让我知道我可能做错了什么。如果无法在原始 Activity 未收到的 URI 上使用 openFileDescriptor,请建议一种在后台上传巨大附件的好方法,因为用户在选择要上传的文件后可能会离开 Activity。感谢您的帮助。

【问题讨论】:

请分享堆栈跟踪和更多详细信息。 感谢您的回复。我已经添加了堆栈跟踪。 Intent 中包含FLAG_GRANT_READ_URI_PERMISSION,用于启动IntentService。默认情况下,only your activity has access to the content identified by the Uri 感谢@CommonsWare,它成功了。我希望你能看到我的问题和答复。感谢您的快速帮助。 【参考方案1】:

解决了。修复是 @CommonsWare 建议的 - 在用于启动 IntentService 的 Intent 中包含 FLAG_GRANT_READ_URI_PERMISSION。默认情况下,只有您的活动才能访问由 Uri 标识的内容

【讨论】:

以上是关于Android 10:无法在 IntentService 中使用 openFileDescriptor的主要内容,如果未能解决你的问题,请参考以下文章

Android自学之路——Service与IntentService

Android中Service与IntentService的使用比较

Android 模拟器无法在 MacOS 10.10 中启动

由于位置许可,BLE 蓝牙扫描无法在 Android 10 和 11 上运行

Wifi Direct P2P 无法在 Android 10+ 设备上运行,无法发现设备

Android 10:无法在 IntentService 中使用 openFileDescriptor