Android 12设备Content Provider访问异常:单设备无法获取Provider信息求助
Android 12跨应用Content Provider访问不一致问题排查
问题描述
两台同型号Android 12设备上,应用A(自定义Content Provider)和应用B(访问该Provider)表现不一致:一台设备上应用B可正常读取数据,另一台设备上调用ContentResolver.query()返回cursor == null,Logcat报错:
ActivityThread: Failed to find provider info for com.example.content_provider
应用A的Manifest配置
<application> <provider android:name=".content_provider.MyContentProvider" android:authorities="com.example.content_provider" android:enabled="true" android:exported="true" /> </application>
应用B的Manifest配置
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission"/> <queries> <package android:name="com.example.content_provider" /> </queries> <queries> <provider android:authorities="com.example.content_provider" /> </queries>
核心代码
应用A/B使用的Authority常量:
val AUTHORITY = "com.example.content_provider"
public static final String URI_FOR_CHANNEL_PARSING = "content://com.example.content_provider/channel";
应用B的查询逻辑:
Uri channelUri = Uri.parse(URI_FOR_CHANNEL_PARSING); ContentResolver contentResolver = mContext.getContentResolver(); Cursor cursor = contentResolver.query(channelUri, null, null, null, null);
可能原因及解决方案
1. 应用B的<queries>配置错误
AndroidManifest中<queries>标签不允许拆分多个独立节点,多个<queries>会导致系统解析异常,无法正确声明包可见性需求。
修复方案:合并所有<queries>内容到一个标签中:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission"/> <queries> <package android:name="com.example.content_provider" /> <provider android:authorities="com.example.content_provider" /> </queries>
2. 应用A在故障设备上未正确注册
- 应用A未完成安装流程,或从未启动过:Android 12的包可见性规则下,未启动过的应用可能不会被系统暴露其组件信息。
- 应用A的Provider因安装异常未被系统注册。
修复方案:在故障设备上卸载重装应用A,并确保应用A至少启动一次。
3. 设备厂商隐私限制
部分Android 12设备厂商会额外限制应用的跨应用访问权限,可能导致应用B无法获取应用A的Provider信息。
修复方案:检查故障设备的应用权限设置,找到应用B的“查看其他应用”权限并确保其已开启。
4. 应用签名不一致
如果两台设备上的应用A/B使用不同的签名构建(比如一台是Debug签名,一台是Release签名),会导致系统权限验证失败,无法访问Provider。
修复方案:确保两台设备上的应用A/B使用相同的签名文件构建打包。
补充疑问解答
不存在因Cursor未关闭或被其他进程读取导致应用B无法找到Provider的情况。Failed to find provider info是系统层面无法找到该Provider的注册信息,属于组件可见性问题;而Cursor未关闭只会引发内存泄漏,不会影响Provider的可访问性。
内容的提问来源于stack exchange,提问作者androiddev
相关产品推荐
相关产品推荐

