Android Studio中如何通过代码拦截/屏蔽其他应用通知?
Android拦截指定应用通知的解决方案
你的代码存在几个关键问题导致无法正常工作,以下是修正方案:
问题分析
- 版本注解错误:
onNotificationPosted方法添加了@RequiresApi(Build.VERSION_CODES.Q),导致Android 10以下的系统完全不会触发这个回调,覆盖不了多数在用设备。 - 未过滤目标应用:当前代码会拦截所有应用的通知,没有针对WhatsApp、Instagram等目标包做判断。
- 无效的清除逻辑:
clearNotofication方法用自身应用的NotificationManager去取消其他应用的通知,这是无效的——每个应用只能管理自己的通知。 - 权限未确认:
NotificationListenerService需要用户在系统设置的「通知使用权」中手动授权,仅在Manifest声明权限远远不够。
修正后的代码
NotificationListenerService实现
class BlockNotification : NotificationListenerService() { // 需要拦截的应用包名列表,可按需添加 private val blockedPackages = setOf( "com.whatsapp", "com.instagram.android" ) override fun onBind(intent: Intent): IBinder? { return super.onBind(intent) } override fun onNotificationPosted(sbn: StatusBarNotification) { super.onNotificationPosted(sbn) val packageName = sbn.packageName Log.d("Msg", "Notification arrived from $packageName") // 仅拦截目标应用的通知 if (blockedPackages.contains(packageName)) { // 根据系统版本选择对应取消方法 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cancelNotification(sbn.packageName, sbn.tag, sbn.id) } else { cancelNotification(sbn.key) } } } override fun onNotificationRemoved(sbn: StatusBarNotification) { super.onNotificationRemoved(sbn) Log.d("Msg", "Notification Removed from ${sbn.packageName}") // 无需额外清除操作,cancelNotification已完成处理 } }
Manifest声明(简化版)
移除不必要的通知过滤meta-data,避免遗漏需要拦截的通知:
<service android:name=".utils.BlockNotification" android:exported="true" android:label="通知拦截服务" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService" /> </intent-filter> </service>
必要操作:引导用户授权
必须在应用中添加逻辑,引导用户跳转到系统设置开启「通知使用权」,否则服务无法正常工作:
// 检查是否已获取通知监听权限 fun isNotificationListenerEnabled(context: Context): Boolean { val packageName = context.packageName val flat = Settings.Secure.getString( context.contentResolver, "enabled_notification_listeners" ) return flat?.contains(packageName) == true } // 跳转到通知使用权设置页面 fun openNotificationListenerSettings(context: Context) { val intent = Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS") context.startActivity(intent) }
在你的Activity启动时调用上述方法,示例:
if (!isNotificationListenerEnabled(this)) { openNotificationListenerSettings(this) }
注意事项
- 部分厂商定制系统可能限制
NotificationListenerService的后台运行权限,需确保应用未被后台限制。 - Android 13及以上,应用自身的通知需要
POST_NOTIFICATIONS权限,但不影响通知监听服务的拦截逻辑。
内容的提问来源于stack exchange,提问作者Jayant Kumar
相关产品推荐
相关产品推荐

