我有 2 个应用程序 - Demo和Pro。Demo 有一个内容提供者,当安装 Pro 时,它需要从演示提供者传输所有文件。
演示应用程序(提供者):
<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 输入 = new FileInputStream(pfd.getFileDescriptor());
java.lang.SecurityException: Permission Denial: 从 ProcessRecord{9c85875 10734 打开 provider .provider.InternalStorageProvider: /u0a61} (pid=10734, uid=10061) 不是从 uid 10062 导出的
实验二:
活动活动 = getActivity(); activity.grantUriPermission(activity.getPackageName(),exposedFileUri,Intent.FLAG_GRANT_READ_URI_PERMISSION);
ParcelFileDescriptor pfd = cr.openFileDescriptor(exposedFileUri, "r"); FileInputStream 输入 = 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 权限?