DocumentProvider无权拥有ContentProvider

时间:2018-11-16 09:41:06

标签: android android-contentprovider android-database document-provider

我的应用程序有2种提供程序类型

基本通信流程是第3个应用程序向DP请求一些信息,而DP则向CP请求该信息并将信息返回给第3个应用程序。

假设我们使用Microsoft Word / Excel从DocumentProvider中获取一些数据。这是应用程序之间通信流程的方案:

单词<------->文档提供者<----错误在这里----> ContentProvider

问题在于DocumentProvider无法访问其自己的ContentProvider。我的意思是DP和CP在1个应用程序中,但是它们在不同的进程中运行。

错误是:

java.lang.SecurityException: Permission Denial: reading com.app.name.provider.DataBaseContentProvider uri content://com.app.name.db.provider/files/innnerFiles/151515 from pid=6655, uid=10042 requires the provider be exported, or grantUriPermission

DP:

<provider
        android:name="com.app.name.provider.DocProvider"
        android:authorities="com.app.name.provider.DocProvider"
        android:exported="true"
        android:grantUriPermissions="true"
        android:permission="android.permission.MANAGE_DOCUMENTS">
        <intent-filter>
            <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
        </intent-filter>
</provider>

CP:

<provider
    android:name="com.app.name.provider.DBProvider"
    android:authorities="com.app.name.provider.DBProvider"
    android:exported="false" />

2 个答案:

答案 0 :(得分:0)

属性

android:authority

属性,即您的包裹名称 在此示例中,

com.app.name.provider.documents

内容提供者的类型(文档)

Custom document provider

答案 1 :(得分:0)

回答此问题需要更多信息,包括源代码。

但是,根据developer's doc

  

授予许可是一种使通常无权访问其数据的提供者的客户端能够一次克服该限制的方法。

通过在DocProvider的清单声明中添加grant-uri-permission元素,可以授予对特定uri的访问权限,问题可以解决。

<provider
    android:name="com.app.name.provider.DocProvider"
    android:authorities="com.app.name.provider.DocProvider"
    android:exported="true"
    android:grantUriPermissions="true"
    android:permission="android.permission.MANAGE_DOCUMENTS">

    <intent-filter>
        <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
    </intent-filter>

    <grant-uri-permission android:pathPrefix="content://com.app.name.db.provider" />

</provider>