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

Google Fit Sensor API无法获取TicWatch Pro心率数据源的技术咨询

关于Google Fit Sensor API订阅TicWatch Pro心率数据的问题解答

我之前开发健身类App时也碰到过类似Wear OS设备和Google Fit Sensor API兼容的问题,结合我的实战经验来给你梳理下解决方案:

先明确结论:是可以直接通过Sensor API订阅实时心率数据的

你的History API能正常拿到数据,说明账号权限、数据同步逻辑都是没问题的,问题大概率出在Sensor API的请求配置细节或者手表端的数据流优先级设置上。

1. 调整Sensor API的数据源请求参数

你当前代码指定了DataSource.TYPE_RAW,但很多Wear OS设备的心率数据是以**衍生数据(TYPE_DERIVED)**的形式推送的,而非原始数据。建议修改请求去掉数据源类型限制,或者同时兼容两种类型:

Fitness.getSensorsClient(this, getGoogleAccount()).findDataSources(
    DataSourcesRequest.Builder()
        .setDataTypes(DataType.TYPE_HEART_RATE_BPM)
        // 可以去掉setDataSourceTypes限制,或者同时支持RAW和DERIVED
        // .setDataSourceTypes(DataSource.TYPE_RAW, DataSource.TYPE_DERIVED)
        .build()
)

另外,部分手表只有在运动模式激活时才会通过Sensor API推送实时心率,你可以试试在TicWatch上启动一个运动项目,再重新调用findDataSources,大概率能找到对应的心率数据源。

2. 检查TicWatch Pro端的关键配置

TicWatch同时运行Mobvoi自有健康生态和Google Fit,有时候会出现数据流向冲突:

  • 确保手表上的Google Fit App登录了和手机端完全一致的谷歌账号,并且已经授予了身体传感器权限健康数据访问权限
  • 暂时禁用Mobvoi健康App的心率访问权限(手表系统设置里可以找到),强制让心率数据直接流向Google Fit(测试完成后再恢复即可)
  • 检查手表的Wear OS版本,建议升级到最新稳定版,旧版本对Google Fit Sensor API的支持可能存在兼容性漏洞

3. 临时替代方案:History API轮询

如果上述调整后还是无法通过Sensor API获取实时数据,可以用History API做短时间范围的轮询,模拟实时数据效果:

private fun pollLatestHeartRate() {
    val endTime = System.currentTimeMillis()
    val startTime = endTime - 30_000 // 拉取最近30秒的心率数据
    Fitness.getHistoryClient(this, getGoogleAccount())
        .readData(
            DataReadRequest.Builder()
                .read(DataType.TYPE_HEART_RATE_BPM)
                .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                .build()
        )
        .addOnSuccessListener { result ->
            result.dataSets.forEach { dataSet ->
                dataSet.dataPoints.forEach { dataPoint ->
                    // 提取最新心率值
                    val heartRate = dataPoint.getValue(Field.FIELD_BPM).asFloat()
                    Timber.i("Latest heart rate: $heartRate")
                }
            }
        }
}

你可以用Handler或者WorkManager设置每20-30秒执行一次这个方法,基本能满足健身App的实时数据需求。

总结

你的问题更偏向TicWatch Pro的Wear OS和自有生态的兼容性问题,而非Sensor API本身的功能限制。先调整请求参数并检查手表端的权限配置,应该就能找到心率数据源;如果还是不行,History API轮询是个可靠的临时方案。

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

火山引擎 最新活动