Android 如何使用FileProvider通过intent授予提供多个URI的权限

Android 如何使用FileProvider通过intent授予提供多个URI的权限,android,android-fileprovider,Android,Android Fileprovider,我试图在文件提供者的帮助下,通过意图从一个应用程序到另一个应用程序提供多个URI 当只发送一个URI时,我使其正常工作,如下所示: resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); resultIntent.setDataAndType(contentUri,getContentResolver().getType(contentUri)); setResult(RESULT_OK, resultIntent); 在我

我试图在
文件提供者的帮助下,通过
意图
从一个应用程序到另一个应用程序提供多个URI

当只发送一个URI时,我使其正常工作,如下所示:

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

setResult(RESULT_OK, resultIntent);
在我的“接收”应用程序中,我可以在活动结果中继续这样做:

Uri returnUri = data.getData();
ParcelFileDescriptor mInputPFD = getContext().getContentResolver().openFileDescriptor(returnUri, "r");
现在我尝试发送URI的
ArrayList

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吗?我可以这样做吗?难道其他应用程序不能像那样访问提供商应用程序的私有文件吗

我必须在这里指定什么包?我的提供者应用程序或接收者应用程序包,因为我无法使其正常工作,只能获得一些关于缺少权限的异常

任何帮助或提示都将不胜感激

解决此问题

我的问题是,我在我的接收器应用程序中调用了
grantUriPermission()
,而不是在提供者应用程序中调用了它。因此,调用以下命令修复了权限异常:

getApplicationContext().grantUriPermission(getCallingPackage(), fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

“难道其他所有应用程序都不能像这样访问提供商应用程序的私有文件吗?”--不,因为您只向
grantUriPermission()
调用中您命名的任何应用程序授予权限。“我必须在这里指定什么包裹?”--接收者。“在我的接收应用程序中手动设置权限是一个好主意吗”--在API级别21之前,您没有太多选择。谢谢@commonware的回答。我遇到以下异常
权限拒绝:打开未导出的提供程序[…]
。但是
android:exported
应该是
false
我猜?。我必须在provider或receiver中调用
grantUriPermission
“但是我想android:exported应该是false?”--是的,这是
FileProvider
的要求。“我必须在提供者或接受者中调用grantUriPermission吗?”--IMHO,在调用
startActivity()
启动将使用您的
Uri
值的第三方应用程序之前,您可以在
活动中调用它。有关与您类似的场景,请参阅,我使用
grantUriPermission()
获取
动作图像捕获中的
额外输出值。