You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 14以下设备无法唤起Health Connect权限授权界面

Android 14以下设备无法唤起Health Connect权限授权界面

嗨,这个问题我之前帮同事排查过,核心原因是Android 14以下的Health Connect权限机制和普通系统权限完全不同,你用系统自带的RequestMultiplePermissions去请求肯定行不通——系统根本识别不到这些Health Connect专属权限,所以直接触发了回调,不会弹出授权界面。

给你梳理下正确的解决步骤:

1. 先引入Health Connect SDK依赖

首先确保你的项目里已经引入了Health Connect的客户端SDK:

implementation "androidx.health.connect:connect-client:1.1.0"

2. 检查Health Connect应用是否安装(Android<14必备)

Android 14之前Health Connect不是系统内置应用,用户需要单独安装。所以发起权限请求前,得先检查应用是否可用:

private suspend fun isHealthConnectAvailable(): Boolean {
    return try {
        val healthConnectClient = HealthConnectClient.getOrCreate(this)
        healthConnectClient.permissionController.getGrantedPermissions()
        true
    } catch (e: Exception) {
        // 这里可以引导用户去应用商店下载Health Connect
        false
    }
}

3. 使用Health Connect专属的权限请求流程

别再用系统的RequestMultiplePermissions了,改用Health Connect SDK提供的权限控制器来发起请求:

// 初始化Health Connect客户端
val healthConnectClient = HealthConnectClient.getOrCreate(this)

// 定义需要的权限(对应你要请求的那些读权限)
val requiredPermissions = setOf(
    Permission.createReadPermission(WeightRecord::class),
    Permission.createReadPermission(HeightRecord::class),
    Permission.createReadPermission(CaloriesBurnedRecord::class),
    Permission.createReadPermission(SleepSessionRecord::class),
    Permission.createReadPermission(ExerciseSessionRecord::class),
    Permission.createReadPermission(StepsRecord::class)
)

// 创建专属的权限请求契约
val requestPermissionsContract = healthConnectClient.permissionController.createRequestPermissionsContract()

// 注册ActivityResultLauncher
val permissionLauncher = registerForActivityResult(requestPermissionsContract) { grantedPermissions ->
    // 处理授权结果
    if (grantedPermissions.containsAll(requiredPermissions)) {
        // 所有权限都拿到了,可以正常访问健康数据了
    } else {
        // 部分或全部权限被拒绝,需要提示用户开启
    }
}

// 发起授权请求
permissionLauncher.launch(requiredPermissions)

为什么原来的方式不行?

你在Logcat里看到的日志已经说明了问题:那些android.permission.health.xxx权限根本不在系统默认的权限组里,系统的权限请求机制根本不认识它们,自然不会弹出授权界面,直接返回未授予的结果。

只有通过Health Connect SDK提供的专属流程,才能唤起它的授权界面——因为这些权限是由Health Connect应用来管理的,不是系统权限框架。

备注:内容来源于stack exchange,提问作者anthony

火山引擎 最新活动