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

WearOS调用startExercise触发Missing Permission权限缺失异常

解决WearOS健康服务API调用startExercise时的权限缺失异常

针对三星Watch 6(WearOS)上调用Android健康服务API的startExercise方法触发的SecurityException: Missing permissions异常,可按以下步骤排查解决:

1. 确认动态申请的权限集合完整度

你在Fragment中通过permissionLauncher.launch(REQUIRED_PERMISSIONS)申请权限,需确保REQUIRED_PERMISSIONS包含所有与功能匹配的必要权限:

  • 由于你开启了GPS(isGpsEnabled = true),必须包含ACCESS_FINE_LOCATION(无需同时申请ACCESS_COARSE_LOCATION,前者覆盖后者权限范围);
  • 针对Android 13+(WearOS 4及以上),后台传感器访问需要BODY_SENSORS_BACKGROUND,需加入申请列表;
  • 运动识别需要ACTIVITY_RECOGNITION,通知权限POST_NOTIFICATIONS也不能遗漏。

正确的权限数组定义示例:

private val REQUIRED_PERMISSIONS = arrayOf(
    Manifest.permission.BODY_SENSORS,
    Manifest.permission.BODY_SENSORS_BACKGROUND,
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACTIVITY_RECOGNITION,
    Manifest.permission.POST_NOTIFICATIONS
)

2. 校验权限申请结果,确保全部授予

不能默认权限申请成功,必须在回调中验证所有权限是否被用户授予,仅在全部通过后再执行startExercise:

private val permissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestMultiplePermissions()
) { permissions ->
    val allPermissionsGranted = permissions.values.all { it }
    if (allPermissionsGranted) {
        // 权限全部通过,执行运动启动逻辑
        initAndStartExercise()
    } else {
        // 提示用户必须授予所有必要权限才能使用功能
    }
}

3. 更新Manifest中的前台服务权限(Android 12+)

Android 12及以上版本要求特定类型的前台服务使用对应权限,运动服务需添加FOREGROUND_SERVICE_HEALTH权限,替换或补充原有的FOREGROUND_SERVICE:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH" />
<!-- 保留通用前台服务权限也可,但若仅用于运动场景,推荐使用特定权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

4. 确认Health Services依赖版本与WearOS兼容

WearOS更新可能导致旧版本的健康服务客户端依赖出现兼容性问题,确保你使用的health-services-client版本与当前Watch6的WearOS版本匹配(如WearOS 4对应依赖版本≥1.1.0):

// build.gradle (Module level)
implementation "androidx.health:health-services-client:1.2.0"

建议使用官方发布的稳定版本,避免版本不匹配引发的权限逻辑异常。

5. 验证Health Services连接状态

权限异常有时可能是客户端未正确连接导致的,调用startExercise前先确认健康服务可用:

val healthServicesClient = HealthServicesClient.get(requireContext())
val availability = healthServicesClient.healthServicesAvailability.await()
if (availability != HealthServicesAvailability.SUPPORTED) {
    // 处理设备不支持健康服务的情况
    return
}

6. 检查ExerciseConfig数据类型对应的权限匹配

你的dataTypes包含DISTANCE(依赖GPS/位置权限)、HEART_RATE_BPM(依赖传感器权限),需确保这些数据类型对应的权限已被正确授予,避免因单个数据类型权限缺失触发整体异常。


内容的提问来源于stack exchange,提问作者M. Usman Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:34:57