Как предоставить разрешения, предоставляющие несколько URI через намерение, используя FileProvider

Я пытаюсь предоставить несколько URI через Intent с помощью FileProvider из одного приложения в другое.

У меня это работает при отправке только одного URI, например:

resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
resultIntent.setDataAndType(contentUri,getContentResolver().getType(contentUri));

setResult(RESULT_OK, resultIntent);

В моем «принимающем» приложении я могу продолжить так в onActivityResult:

Uri returnUri = data.getData();
ParcelFileDescriptor mInputPFD = getContext().getContentResolver().openFileDescriptor(returnUri, "r");

Теперь я попытался отправить ArrayList URI:

resultIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList);
resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
setResult(RESULT_OK, resultIntent);

но флаг предоставленного разрешения применяется только к URI, установленному в setData(), поэтому я не могу получить доступ к URI из ArrayList в принимающем приложении. Я читал о ClipData как о решении, но, к сожалению, я вынужден использовать Min SDK 15.

Итак, мой вопрос: стоит ли устанавливать разрешения вручную в моем принимающем приложении с помощью чего-то вроде

context.grantUriPermission("com.example.provider", returnUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

для каждого URI, который я получу, если выберу опцию «ArrayList» и отменю ее позже? Могу ли я это сделать вообще? Разве любое другое приложение не могло бы также получить доступ к личным файлам приложения-провайдера?

И какой пакет я должен указать здесь? Приложение моего провайдера или мой пакет приложения-приемника, так как я не заставляю это работать и получаю только некоторые исключения в отношении отсутствия разрешения.

Любая помощь или подсказки приветствуются


person c7n    schedule 01.06.2016    source источник
comment
Разве любое другое приложение не могло бы также получить доступ к личным файлам приложения-провайдера? -- нет, потому что вы предоставляете разрешения только тому приложению, которое вы называете в вызове grantUriPermission(). И какой пакет я должен указать здесь? -- получатель. Это хорошая идея, чтобы установить разрешения вручную в моем принимающем приложении - до уровня API 21 у вас нет большого выбора, насколько я знаю.   -  person CommonsWare    schedule 01.06.2016
comment
спасибо за ответы @CommonsWare. Я получаю следующее исключение Permission Denial: opening provider [...] that is not exported [...]. Но android:exported должно быть false, наверное? Должен ли я звонить grantUriPermission провайдеру или получателю?   -  person c7n    schedule 02.06.2016
comment
Но android:exported должно быть ложным, я думаю? -- да, это требование FileProvider. Должен ли я вызывать GrantUriPermission у провайдера или получателя? -- ИМХО, вы вызываете его в своем Activity непосредственно перед вызовом startActivity() для запуска стороннего приложения, которое будет использовать ваши значения Uri. См. этот пример проекта, где описан сценарий, аналогичный вашему, где Я использую grantUriPermission() для значения EXTRA_OUTPUT в ACTION_IMAGE_CAPTURE Intent.   -  person CommonsWare    schedule 02.06.2016


Ответы (1)


Решил это.

Моя проблема заключалась в том, что я вызвал grantUriPermission() в своем приложении-получателе, а не в приложении-поставщике, как должно быть. Таким образом, вызов следующих фиксированных исключений разрешений:

getApplicationContext().grantUriPermission(getCallingPackage(), fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
person c7n    schedule 02.06.2016