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