2

我正在尝试在从一个应用程序到另一个应用程序Intent的帮助下通过 an 提供多个 URI。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");

现在我尝试发送一个ArrayListURI:

resultIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uriList);
resultIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
setResult(RESULT_OK, resultIntent);

但是授予的权限标志仅适用于 中设置的 URI setData(),因此我无法从接收应用程序中的 ArrayList 访问 URI。我阅读了有关 ClipData 作为解决方案的信息,但不幸的是,我不得不使用 Min SDK 15。

所以我的问题是,在我的接收应用程序中手动设置权限是一个好主意吗?

context.grantUriPermission("com.example.provider", returnUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

如果我选择“ArrayList”选项并在以后撤销它,我会得到每个 URI?我可以这样做吗?难道其他所有应用程序都不能像那样访问提供商应用程序的私人文件吗?

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

任何帮助或提示表示赞赏

4

1 回答 1

4

解决了。

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

getApplicationContext().grantUriPermission(getCallingPackage(), fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
于 2016-06-02T10:12:29.277 回答