Android 11如何使用ContentResolver读取其他应用导出的ContentProvider
问题原因
Android 11(API 30)引入了包可见性过滤机制,该机制独立于组件的exported属性校验:即使目标ContentProvider已经配置android:exported="true",普通第三方应用默认也无法感知到该Provider的存在,只有在访问端应用的清单文件中声明了对应的可见性规则后才能正常访问。
adb shell身份不受普通应用的包可见性规则限制,所以可以正常查询到数据。
解决步骤
- 修改访问端应用的清单文件
在访问端应用AndroidManifest.xml的<manifest>根节点下(与<application>节点同级)添加<queries>标签,声明需要访问的ContentProvider的authority:
<queries> <provider android:authorities="my.content.Provider" /> </queries>
- 修正查询Uri(可选,避免后续报错)
你当前代码中的查询Uri是content://my.content.Provider/data,而adb测试时使用的无/data后缀的Uri才是匹配你Provider配置的正确地址,建议将查询代码中的Uri修改为:
val cursor = contentResolver.query( Uri.parse("content://my.content.Provider"), null, null, null, null )
- 重新编译安装两个应用,测试访问即可。
内容的提问来源于stack exchange,提问作者nibarius
相关产品推荐
相关产品推荐

