我正在尝试通过Intent
在FileProvider
的帮助下从一个应用提供多个URI。
我发送它时,只发送一个如下所示的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);
但授予的权限标志仅适用于setData()
中设置的URI,因此我无法从接收应用程序中的ArrayList访问URI。我读到ClipData作为解决方案,但我不幸被迫使用Min SDK 15。
所以我的问题是,在我的接收应用中手动设置权限是个好主意,比如
context.grantUriPermission("com.example.provider", returnUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
如果我选择“ArrayList”选项并稍后撤销它,我会得到的每个URI ?我可以这样做吗?难道每个其他应用都无法访问提供商应用的私人文件吗?
我需要在这里指定哪个包?我的提供商应用程序或我的接收器应用程序包,因为我没有让它工作,只有一些关于缺少权限的例外。
感谢任何帮助或提示
答案 0 :(得分:4)
解决了它。
我的问题是,我在接收器应用中调用了grantUriPermission()
,而不是应该在提供商应用。因此,调用以下内容修复了权限异常:
getApplicationContext().grantUriPermission(getCallingPackage(), fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);