0

我需要通过我们的应用上传用户选择的附件。在接受用户选择的 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 ProcessRecord{6148698 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。感谢你的帮助。

4

1 回答 1

0

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

于 2020-04-18T13:48:07.467 回答