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

Android应用能否监听系统设置变更?Notification Access状态监听求助

监听Android通知访问权限变化的正确方式

你的问题出在错误的Uri上:Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS是打开通知监听设置页面的Action,并非对应权限状态的设置项Uri,所以注册的ContentObserver不会触发回调。

正确的做法是监听Settings.Secure.ENABLED_NOTIFICATION_LISTENERS这个设置项的变化,它存储了所有已开启通知监听权限的包名列表。

正确实现代码

class YourActivity : AppCompatActivity() {
    private lateinit var notificationObserver: ContentObserver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val handler = Handler(Looper.getMainLooper())
        notificationObserver = object : ContentObserver(handler) {
            override fun onChange(selfChange: Boolean) {
                super.onChange(selfChange)
                // 权限状态变化时触发,在这里检查权限并显示提示
                val hasPermission = isNotificationListenerEnabled()
                if (hasPermission) {
                    Toast.makeText(this@YourActivity, "通知访问权限已开启", Toast.LENGTH_SHORT).show()
                } else {
                    Toast.makeText(this@YourActivity, "通知访问权限已关闭", Toast.LENGTH_SHORT).show()
                }
            }
        }

        // 注册Observer,监听ENABLED_NOTIFICATION_LISTENERS的变化
        contentResolver.registerContentObserver(
            Settings.Secure.getUriFor(Settings.Secure.ENABLED_NOTIFICATION_LISTENERS),
            false,
            notificationObserver
        )
    }

    // 检查当前应用是否已开启通知监听权限
    private fun isNotificationListenerEnabled(): Boolean {
        val enabledListeners = Settings.Secure.getString(
            contentResolver,
            Settings.Secure.ENABLED_NOTIFICATION_LISTENERS
        ) ?: return false
        val packageName = packageName
        return enabledListeners.contains(packageName)
    }

    override fun onDestroy() {
        super.onDestroy()
        // 记得注销Observer,避免内存泄漏
        contentResolver.unregisterContentObserver(notificationObserver)
    }
}

关键说明

  • 监听的核心设置项是Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,它的值是所有拥有通知监听权限的应用包名,用冒号分隔。
  • 在onChange回调中,调用isNotificationListenerEnabled()方法判断当前应用的权限状态,再做出对应的提示操作。
  • 务必在页面销毁时注销ContentObserver,防止内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:11:15