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

Android 14中USE_FULL_SCREEN_INTENT权限检查始终返回GRANTED求助

问题分析与解决方案

核心问题

基于Kotlin+Compose开发的来电类应用中,使用rememberPermissionState检查POST_NOTIFICATIONS权限时,能正常反映用户的授权/撤销状态;但检查USE_FULL_SCREEN_INTENT权限时,无论用户在Android 14上是否手动撤销该权限,始终返回GRANTED,只有NotificationManager.canUseFullScreenIntent()能正确返回权限实际状态。

原因解析

这并非Android 14的Bug,而是权限类型差异导致的检查逻辑不匹配:

  • POST_NOTIFICATIONS属于普通运行时权限,Android的常规权限检查API(checkSelfPermission等)可以准确获取其授权状态,Compose的rememberPermissionState正是基于这类常规API实现的。
  • USE_FULL_SCREEN_INTENT属于特殊权限,Android对这类权限的管理逻辑不同于普通权限:即使用户手动撤销,checkSelfPermission仍会返回GRANTED,但实际能否使用该权限需要通过NotificationManager的专用方法验证——这是Android权限体系的设计规则,而非版本Bug。

统一检查方案

若想避免单独写特例逻辑,可以封装一个自定义的权限检查状态,统一对外暴露接口:

自定义权限状态封装

@Composable
fun rememberCustomPermissionState(permission: String): PermissionState {
    val context = LocalContext.current
    val defaultState = rememberPermissionState(permission)
    
    return remember(permission) {
        object : PermissionState by defaultState {
            override val status: PermissionStatus
                get() {
                    return if (permission == android.Manifest.permission.USE_FULL_SCREEN_INTENT) {
                        val notificationManager = context.getSystemService(NotificationManager::class.java)
                        if (notificationManager.canUseFullScreenIntent()) {
                            PermissionStatus.Granted
                        } else {
                            PermissionStatus.Denied(false)
                        }
                    } else {
                        defaultState.status
                    }
                }
        }
    }
}

使用方式

替换原有的rememberPermissionState为自定义的rememberCustomPermissionState即可:

val fullScreenIntentPermissionState = rememberCustomPermissionState(
    android.Manifest.permission.USE_FULL_SCREEN_INTENT
)
val notificationsPermissionState = rememberCustomPermissionState(
    android.Manifest.permission.POST_NOTIFICATIONS
)

这样既保留了统一的调用方式,又针对USE_FULL_SCREEN_INTENT的特殊逻辑做了内部处理,无需在业务代码中写分支判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:51:14