目 录CONTENT

文章目录

Android 通知读取权限授予的判断和申请

Stars-one
2026-04-16 / 0 评论 / 0 点赞 / 2 阅读 / 0 字

通知读取权限的判断逻辑记录

/**
 * 通知权限状态管理
 */
object NotificationPermissionFlow {
    private val _permissionState = MutableStateFlow(application.isNotificationServiceEnabled())
    val permissionState: StateFlow<Boolean> = _permissionState.asStateFlow()

    private var isRegistered = false

    private val contentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {
        override fun onChange(selfChange: Boolean) {
            super.onChange(selfChange)
            "通知授权数据变更: ${selfChange}".logd("ccc")
            updatePermissionState()
        }
    }

    fun startMonitoring() {
        if (!isRegistered) {
            application.let { context ->
                context.contentResolver.registerContentObserver(
                    Settings.Secure.getUriFor("enabled_notification_listeners"),
                    false,
                    contentObserver
                )
                isRegistered = true
            }
        }
    }

    fun stopMonitoring() {
        if (isRegistered) {
            application.contentResolver?.unregisterContentObserver(contentObserver)
            isRegistered = false
        }
    }

    private fun updatePermissionState() {
        application.let { context ->
            val hasPermission = context.isNotificationServiceEnabled()
            _permissionState.value = hasPermission
        }
    }
}


/**
 * 简化版 Compose 组件,直接返回通知权限状态
 * @param context 应用上下文
 * @return 通知权限状态
 */
@Composable
fun rememberNotificationPermissionState(context: Context): Boolean {
    // 初始化 NotificationPermissionFlow
    LaunchedEffect(context) {
        NotificationPermissionFlow.startMonitoring()
    }
    
    // 监听权限状态变化
    val permissionState by NotificationPermissionFlow.permissionState.collectAsStateWithLifecycle()
    
    // 当组件离开组合时,停止监听
    DisposableEffect(Unit) {
        onDispose {
            NotificationPermissionFlow.stopMonitoring()
        }
    }
    
    return permissionState
}
0

评论区