通知读取权限的判断逻辑记录
/**
* 通知权限状态管理
*/
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
}
评论区