【发布时间】:2016-05-30 09:17:01
【问题描述】:
我有 2 个应用程序 - Demo 和 Pro。 Demo 有一个 content provider,安装 Pro 后需要从 demo provider 传输所有文件。
演示应用(提供者):
<provider
android:name="***.provider.InternalStorageProvider"
android:authorities="***.demo.storage.int.provider"
android:exported="false"
android:syncable="true"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/int_storage_paths" />
</provider>
专业应用(消费者):
-
实验一:
ParcelFileDescriptor pfd = cr.openFileDescriptor(exposedFileUri, "r");
FileInputStream input = new FileInputStream(pfd.getFileDescriptor());
java.lang.SecurityException: Permission Denial: 打开提供者 .provider.InternalStorageProvider 来自 ProcessRecord{9c85875 10734:/u0a61} (pid=10734, uid=10061) 不是从 uid 10062 导出的
-
实验 2:
活动活动 = getActivity(); activity.grantUriPermission(activity.getPackageName(),exposedFileUri,Intent.FLAG_GRANT_READ_URI_PERMISSION);
ParcelFileDescriptor pfd = cr.openFileDescriptor(exposedFileUri, "r"); FileInputStream input = new FileInputStream(pfd.getFileDescriptor());
java.lang.SecurityException: Uid 10061 没有 uri 的权限 0@content://***.demo.storage.int.provider/db/file1
InternalStorageProvider 是普通FileProvider 的副本。但这并不重要,因为执行甚至无法达到它。在调用它之前抛出异常。
请注意,不涉及选择器活动和意图。消费者尝试直接从已知 uri 打开文件,无需选择器。我发现的大多数示例都使用Intent.FLAG_GRANT_READ_URI_PERMISSION,但我根本没有使用意图。
我应该如何正确地向消费者授予 uri 权限?
【问题讨论】:
-
现在正在处理这个问题,你有没有机会解决它?
-
那是很久以前的事了,我几乎什么都不记得了。这东西真的很邪恶。
-
通过将
FLAG_GRANT_READ_URI_PERMISSION传递给在我的应用程序中使用 URI 的所有其他意图来解决它
标签: android android-contentprovider android-permissions android-securityexception