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

Android 11/12无法接收Intent.ACTION_PACKAGE_ADDED广播事件问题

问题根因

你无法接收Intent.ACTION_PACKAGE_ADDED事件的核心原因是Android 11(API 30)引入的包可见性过滤规则,和你的广播注册、接收器实现代码无关:

  • Android 11开始,系统默认禁止应用感知其他第三方应用的存在/安装事件,ACTION_PACKAGE_ADDED作为新应用出现的事件,会严格遵循包可见性规则下发:只有有权限查询到新安装应用的App,才能收到该广播。
  • 你能正常收到ACTION_PACKAGE_REMOVED和ACTION_AIRPLANE_MODE_CHANGED是规则设计如此:应用卸载事件属于「已有对象消失」类事件,不受包可见性限制;飞行模式变化是全局系统状态事件,也不受该规则约束。
  • 你在Logcat中看到的Background execution not allowed日志是谷歌GMS组件的接收报错,和你的App无关,不需要处理。
  • 你代码中设置的intentFilter.priority = 999对系统包事件广播无效,系统对第三方应用的广播接收优先级有强制上限,设置过高值不会让你更早收到事件,无实际作用。
修复步骤
  1. 配置包可见性权限
    打开你的AndroidManifest.xml,在<manifest>节点下添加对应配置:
    • 如果你需要感知所有第三方应用的安装事件,添加全量包查询权限:
    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
    

    注意:如果应用需要上架Google Play,申请该权限需要提交合规声明说明使用场景,否则会被拒审。如果只需要感知特定包名、特定intent-filter匹配的应用安装,使用<queries>标签定向声明即可,无需申请全量权限。

  2. 兼容Android 13+动态广播注册规则
    Android 13(API 33)开始,动态注册广播需要明确指定是否对外导出,否则会抛出异常,修改你的广播注册代码做版本兼容:
    val intentFilter = IntentFilter().apply {
        addAction(Intent.ACTION_PACKAGE_ADDED)
        addAction(Intent.ACTION_PACKAGE_REMOVED)
        addDataScheme("package")
    }
    
    val rec = IntentReceiver()
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        registerReceiver(rec, intentFilter, Context.RECEIVER_EXPORTED)
    } else {
        registerReceiver(rec, intentFilter)
    }
    
  3. 可选:如果需要应用进程被杀死后也能接收安装事件,可以将广播改为静态注册,ACTION_PACKAGE_ADDED属于Android 8.0+静态注册豁免的隐式广播,不需要做额外的隐式广播适配,静态注册时同样需要配置上述包可见性权限。

内容的提问来源于stack exchange,提问作者Sachin Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:01:13