Android 10: невозможно позднее получить доступ к изображению, которое можно выбрать через Фото / Галерея - PullRequest
1 голос
/ 25 апреля 2020

Это вариант вопроса, который я задал на днях и решил с помощью.

Android 10: возможность загрузить Uri напрямую, но не с исключением «Отказ в разрешении», когда попытка позже

Используя комбинацию ACTION_OPEN_DOCUMENT и getContentResolver (). takePersistableUriPermission, я могу позже загрузить файл, выбранный пользователем.

Но, если пользователь выбирает изображение через Фото / Галерею, чтобы поделиться им через наше приложение, и если в этот момент нет сети, как и ожидалось, приложение должно попытаться загрузить позже. Во время этой повторной попытки я сталкиваюсь с исключением «Отказ в разрешении». Пожалуйста, дайте мне знать, что может быть не так. Ценим вашу помощь.

Как получается URI

callingIntent = new SharedIntent();
callingIntent.action = getIntent().getAction();
callingIntent.type = getIntent().getType();
if (Intent.ACTION_SEND.equals(callingIntent.action) ||
    Intent.ACTION_SEND_MULTIPLE.equals(callingIntent.action))
{
    callingIntent.uri = (Uri) getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
    if (null == callingIntent.uri)
        callingIntent.uri = getIntent().getData();
    callingIntent.aUri = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);
}

В Намерении, которое получает URI через Фото, у нас есть это -

getContentResolver().takePersistableUriPermission(callingIntent.uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

Для вызова IntentService, которому передается URI для загрузки -

intentService.setData(callingIntent.uri);
intentService.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startService(intentService);

Но когда вызывается startService, возникает исключение «Отказ в разрешении» - «Отказ в разрешении: разрешения для UID не найдены ....»

1 Ответ

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

Вы не можете надежно получить постоянные Uri разрешения для произвольных Uri значений. Это работает, только если вы получаете Uri от Storage Access Framework, например ваш сценарий ACTION_OPEN_DOCUMENT. Uri, который вы получаете от ACTION_SEND или ACTION_SEND_MULTIPLE, вряд ли был получен из Storage Access Framework.

В результате вы должны использовать этот Uri немедленно. Если вы не можете сделать это, ваши варианты:

  1. Скажите пользователю, что вы не можете выполнить желаемую операцию сейчас, или

  2. Сделать локальный скопируйте данные сейчас в файл (например, в getCacheDir()), пока можете, а затем используйте и удалите копию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...