Android 10: невозможно использовать openFileDescriptor внутри IntentService - PullRequest
0 голосов
/ 18 апреля 2020

Мне нужно загрузить вложение, выбранное пользователем через наше приложение. Загрузка работает, когда она вызывается в Activity, которая приняла URI, выбранный пользователем. Но когда я передаю URI в IntentService, чтобы в фоновом режиме можно было загрузить огромное вложение, я получаю исключение «Отказ в разрешении» в IntentService в следующей строке -

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)

Пожалуйста, дайте мне знать что я могу делать не так Если openFileDescriptor не может быть использован для URI, который не был получен исходным действием, пожалуйста, предложите хороший подход для загрузки огромных вложений в фоновом режиме, поскольку пользователь может выйти из действия после выбора файла для загрузки. Ценю вашу помощь.

1 Ответ

0 голосов
/ 18 апреля 2020

Решил это. Исправление - это то, что предложил @CommonsWare - включите FLAG_GRANT_READ_URI_PERMISSION в намерение, которое вы используете для запуска IntentService. По умолчанию только ваша деятельность имеет доступ к контенту, указанному Uri

...