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()
获取动作图像捕获中的额外输出值。