如何通过Health Connect API订阅FitBit心率更新?
Health Connect 订阅心率数据更新的最佳实践
核心实现:基于变更令牌的增量监听
针对Fitbit每分钟同步心率到Health Connect的场景,新版Health Connect API(适配Android 13+)中,官方推荐用变更令牌(Changes Token)机制替代已失效的Changes Sync API,这是目前最接近“回调触发”需求的方案,无需全量轮询或依赖WorkManager的周期性任务。
1. 获取初始变更令牌
首先通过HealthConnectClient获取对应数据类型的变更令牌,后续所有变更拉取都基于这个令牌:
val healthConnectClient = HealthConnectClient.getOrCreate(context) // 指定监听心率数据类型 val heartRateToken = healthConnectClient.getChangesToken(setOf(HeartRateRecord::class))
2. 实现近实时监听(替代回调的方案)
Health Connect暂未提供直接的变更回调API,你可以通过以下两种方式实现近似“触发式”的监听:
- 前台轻量服务:启动一个前台服务,每隔30-60秒(匹配Fitbit的更新频率)调用
getChanges()拉取增量数据。由于用了变更令牌,每次只会返回上次拉取后的新数据,资源消耗极低。 - 系统广播监听:部分设备支持监听
android.health.connect.action.DATA_CHANGED系统广播,收到广播后立即调用getChanges()拉取最新心率数据(需注意部分厂商可能限制该广播的接收)。
3. 处理增量变更数据
调用getChanges()后会返回包含新数据的ChangesResponse,同时生成新的变更令牌,需持久化存储以便下次拉取:
val changesResponse = healthConnectClient.getChanges(heartRateToken) // 筛选出新增的心率记录 val newHeartRates = changesResponse.changes.filterIsInstance<HeartRateRecord>() // 处理最新心率数据(比如更新UI、上传服务器等) // 持久化新令牌,用于下次拉取 saveNewChangesToken(changesResponse.nextChangesToken)
关键注意事项
- 权限要求:必须在Manifest中声明
android.permission.health.READ_HEART_RATE,并在运行时获取用户授权。 - 令牌持久化:变更令牌需要存在SharedPreferences或本地数据库中,避免应用重启后重新拉取所有历史数据。
- 电量优化:前台服务需控制拉取间隔,避免过于频繁;如果使用广播监听,需测试不同厂商设备的兼容性。
- 文档参考:目前官方文档关于变更监听的描述确实模糊,可重点查看Sync Data章节中“变更令牌”相关内容,替代已失效的Changes Sync API链接。
关于轮询的补充
虽然你倾向于避免轮询,但结合变更令牌的增量轮询(1分钟间隔)资源消耗极低,因为不会全量同步数据,只是拉取新增的心率记录,这也是很多开发者当前的折中方案。
内容的提问来源于stack exchange,提问作者Ana
相关产品推荐
相关产品推荐

