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
相关产品推荐
相关产品推荐

