我的应用程序有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" />
答案 0 :(得分:0)
属性
android:authority
属性,即您的包裹名称 在此示例中,
com.app.name.provider.documents
内容提供者的类型(文档)
答案 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>