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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:45:11