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

