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

Android Studio PassiveMonitoringClient无法接收Wear OS模拟器合成心率数据

心率数据读取问题(Wear OS 4 + Health Services PassiveMonitoringClient)

我在运行Wear OS 4/API Level 14的模拟手表上,使用最新版Android Studio Preview,通过Health Services的PassiveMonitoringClient尝试记录心率数据,编写了最小可用示例,但回调从未被调用,日志也没有打印心率数据。已确认ADB连接到正确的模拟设备,但不确定合成数据命令是否生效。

代码片段(MainActivity的OnCreate方法)

val healthClient = HealthServices.getClient(this)
val passiveMonitoringClient = healthClient.passiveMonitoringClient

val passiveListenerConfig = PassiveListenerConfig.builder()
    .setDataTypes(setOf(DataType.HEART_RATE_BPM, DataType.GOLF_SHOT_COUNT))
    .build()

val passiveListenerCallback: PassiveListenerCallback = object : PassiveListenerCallback {
    override fun onNewDataPointsReceived(dataPoints: DataPointContainer) {
        for (dataPoint in dataPoints.sampleDataPoints) {
            val heartRate = dataPoint.value
            Log.i("WearApp", "Received heart rate: $heartRate")
        }
    }
}

passiveMonitoringClient.setPassiveListenerCallback(
    passiveListenerConfig,
    passiveListenerCallback,
)

使用的ADB命令

启用合成数据源:

adb shell am broadcast \                                         
-a "whs.USE_SYNTHETIC_PROVIDERS" \     
com.google.android.wearable.healthservices

启动步行活动:

adb shell am broadcast \                                       
-a "whs.synthetic.user.START_WALKING" \
com.google.android.wearable.healthservices

清单文件权限配置

<uses-permission android:name="android.permission.BODY_SENSORS" />
<uses-permission android:name="android.permission.BODY_SENSORS_BACKGROUND"/>
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.health.READ_HEART_RATE"/> 

排查与解决建议

  • 动态请求权限:Android 13+要求动态申请敏感权限,即使清单已声明,也必须在代码中请求BODY_SENSORS、BODY_SENSORS_BACKGROUND和health.READ_HEART_RATE权限,否则Health Services不会回调数据。
  • 验证合成数据服务状态:执行ADB命令后,通过adb logcat | grep whs查看日志,确认合成数据源是否成功启用,步行活动是否触发。
  • 过滤目标数据类型:当前回调遍历所有sampleDataPoints,包含了不需要的高尔夫挥杆数据,建议针对性过滤心率数据:
    override fun onNewDataPointsReceived(dataPoints: DataPointContainer) {
        dataPoints.getData(DataType.HEART_RATE_BPM)?.let { heartRateDataPoints ->
            for (dataPoint in heartRateDataPoints) {
                val heartRate = dataPoint.value.asFloat()
                Log.i("WearApp", "Received heart rate: $heartRate")
            }
        }
    }
    
  • 简化监听配置:移除DataType.GOLF_SHOT_COUNT,只保留心率数据监听,减少干扰。
  • 更新Health Services:确保模拟器的Google Play服务是最新版本,Health Services组件正常运行。
  • 确保监听生命周期稳定:如果Activity销毁,回调会失效,测试时保持Activity在前台,或把监听逻辑移至Service中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:52:33