Android 10: возможность загрузить Uri напрямую, но происходит сбой с исключением «Отказ в разрешении» при повторной попытке позже - PullRequest
0 голосов
/ 20 апреля 2020

Используя FilePicker, я могу позволить пользователю выбрать файл для загрузки, передать его в IntentService и загрузить его немедленно через тот intentService, если устройство имеет сеть. Но если нет сети, мне нужно сохранить Uri и попытаться загрузить позже, когда устройства подключатся к сети. Эта повторная попытка не удалась. Выдает исключение «Отказ в разрешении», когда я пытаюсь запустить службу во время повторной попытки. Пожалуйста, дайте мне знать, что может быть не так. Ценю вашу помощь.

FILEPICKER
-----------
openFilePickDialog = new Intent();
openFilePickDialog.setType("*/*");
openFilePickDialog.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(openFilePickDialog, "Select File"), PickFileId);

During re-attempt of upload
----------------------------
Intent iUploadService = new Intent(context, UploadService.class);
String uriString = pendingUpload.uriString;
iUploadService.setData(Uri.parse(uriString));
iUploadService.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
iUploadService.putExtra(UploadService.ACTION, UploadService.ACTION_UPLOAD);
context.startService(iUploadService);

Stacktrace
-----------
java.lang.SecurityException: UID 10140 does not have permission to content://com.android.externalstorage.documents/document/primary%3AAndroid%2Fdata%2Fcom.aaaa.bbbb%2Ffiles%2FFolder%2FAttachments%2F1587129056397_IMG-20200414-WA0004.jpg [user 0]; you could 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.startService(IActivityManager.java:5166)
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1601)
at android.app.ContextImpl.startService(ContextImpl.java:1571)
at android.content.ContextWrapper.startService(ContextWrapper.java:669)

1 Ответ

2 голосов
/ 20 апреля 2020

Не используйте ACTION_GET_CONTENT, поскольку, как вы видели, разрешение на чтение не длится долго.

Вместо этого используйте ACTION_OPEN_DOCUMENT и получите постоянное разрешение URI в onActivityResult.

...