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

Android 11 (API 30)下NotificationListenerService如何使用getApplicationInfo?

可行合规的解决方案如下

  • 方案1:使用精准的<queries>清单声明
    不要使用风险较高的QUERY_ALL_PACKAGES权限或者模糊的全局<intent>匹配规则,你可以根据应用的实际使用场景,把需要适配的应用包名精准声明在清单的<queries>节点下,示例配置如下:

    <queries>
        <!-- 按需添加需要处理通知的应用包名,可动态扩充 -->
        <package android:name="com.tencent.mm" />
        <package android:name="com.tencent.mobileqq" />
        <package android:name="com.sina.weibo" />
    </queries>
    

    该方案完全符合应用商店的隐私合规要求,只要声明的包名和你应用的通知处理功能匹配,不会触发下架风险。

  • 方案2:申请QUERY_ALL_PACKAGES权限并提交合规说明
    如果你的应用是通用的通知管理类工具,无法提前枚举所有需要适配的应用包名,可以正常声明QUERY_ALL_PACKAGES权限,在应用上架时向应用商店提交权限使用说明,明确说明该权限仅用于在通知监听服务中获取通知所属应用的名称、图标用于展示,不用于其他非必要的用户隐私数据采集。
    目前Google Play、国内主流应用商店对于通知管理、效率工具类应用的该权限申请,只要用途真实合规都会予以审核通过,不会无故下架。

  • 方案3:利用系统回调的通知对象直接提取基础信息(无需额外权限)
    如果你的需求仅为获取应用名称和图标,不需要完整的ApplicationInfo对象,可以通过StatusBarNotification自带的属性结合PackageManager的接口直接获取:

    // Kotlin示例代码
    val sbn: StatusBarNotification = // 回调拿到的通知对象
    val packageName = sbn.packageName
    // 获取应用名称
    val appName = try {
        packageManager.getApplicationLabel(packageManager.getApplicationInfo(packageName, 0))
    } catch (e: Exception) {
        packageName // 异常兜底显示包名
    }
    // 获取应用图标
    val appIcon = try {
        packageManager.getApplicationIcon(packageName)
    } catch (e: Exception) {
        // 异常兜底用默认图标
        ContextCompat.getDrawable(this, R.drawable.default_app_icon)
    }
    

    Android 11及以上系统对于已获得通知使用权的应用,会自动开放通知所属应用的包信息查询权限,大部分场景下不需要额外声明包可见性规则即可正常调用上述代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:54:03