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

How to grant permissions providing multiple URIs via intent using FileProvider

我试图在 FileProvider 的帮助下通过 Intent 从一个应用程序到另一个应用程序提供多个 URI。

当只发送一个如下所示的 URI 时,我成功了:

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

setResult(RESULT_OK, resultIntent);

在我的 "receiving" 应用程序中,我可以在 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?我能做到吗?难道其他所有应用程序都不能像那样访问提供商应用程序的私人文件吗?

我必须在这里指定什么包?我的提供者应用程序或我的接收者应用程序包,因为我没有让它工作并且只得到一些关于缺少权限的异常。

感谢任何帮助或提示

解决了。

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

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