You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:05:35