6

我有 2 个应用程序 - DemoPro。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 权限?

4

1 回答 1

1

您需要授予专业应用程序的权限...

activity.grantUriPermission("pro app package name", exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
于 2017-03-16T06:00:56.183 回答