授予FileProvider的uri权限会给SecurityException

时间:2016-02-18 09:30:16

标签: android android-contentprovider android-permissions android-securityexception

我有2个应用 - 演示专业。 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>

专业应用(消费者):

  • 实验1:

    ParcelFileDescriptor pfd = cr.openFileDescriptor(exposedFileUri,&#34; r&#34;);
    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,&#34; r&#34;); 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权限?

1 个答案:

答案 0 :(得分:2)

您需要授权专业版...

activity.grantUriPermission("pro app package name", exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);