如何使用 Health Connect API 统一接入第三方健康数据?

解读

国内面试问“怎么用 Health Connect 统一接第三方健康数据”,核心想看三点:

  1. 是否知道 Health Connect 在中国大陆的“双端”现状——Google 版只在海外 Pixel 机器预装,国产 ROM 普遍阉割;国内主流渠道(华米 OV)各自有 Health Service SDK,但华为 Health Kit、OPPO Health Engine 等接口分裂。
  2. 能否给出“统一”的落地策略:即海外用 Health Connect,国内用厂商 SDK,再做一层 Repository 抽象,让业务层无感知。
  3. 是否掌握权限、隐私合规(PIPL+网安法)以及性能细节:后台读数省电、大数据分页、敏感数据加密回传后台。
    答不到“国内无 GMS 怎么办”基本会被判“只看过 I/O 视频”。

知识点

  1. Health Connect 架构

    • 基于 Android 13 新增的 platform 级 ContentProvider,URI 统一形如 content://com.google.android.apps.healthdata/*
    • 数据模型:Record 子类(Steps、Sleep、HeartRate 等),带 Metadata(clientRecordId、device、dataOrigin)
    • 权限颗粒度到类型:读写分离,一次性授权 30 天,支持“后台读”与“前台写”双通道
    • 变化通知:HealthConnectClient#registerObserver,底层用 ContentResolver#registerContentObserver,回调运行在系统进程,App 端需做 JobScheduler 兜底
  2. 国内“无 GMS”替代方案

    • 华为 Health Kit:华为账号 OAuth + 华为运动健康 App 做数据中枢,接口为 REST + 端侧 SDK(HiHealth)
    • OPPO Health Engine:ColorOS 13+ 内置,需上架 OPPO 应用商店并申请 health 权限白名单
    • 小米、vivo 暂无统一 SDK,只能接各自运动 App 的开放接口,或引导用户导出 GPX/CSV 再导入
  3. 统一封装层设计

    • Repository 模式:interface HealthDataSource { suspend fun readSteps(start: Instant, end: Instant): List<StepsRecord> }
    • 工厂根据 Process.isGmsAvailable() 与品牌 Build.MANUFACTURER 决定实例化 HealthConnectDataSource 还是厂商 SDKDataSource
    • 对上层暴露 Flow<PagedData<StepsRecord>>,实现 MVI 单向数据流
  4. 合规与性能

    • 隐私:国内收集心率、睡眠属于“个人敏感信息”,需单独弹窗并取得“明示同意”,后台任务前还需二次提醒;加密采用 TEE+Keystore RSA2048,上传走 https + 双向证书校验
    • 电量:读数间隔≥15 min,使用 WorkManager 加电池白名单;批量插入采用 insertRecords 事务,降低 Binder 调用次数
    • 数据量:一次查询最多 7 天、1 万条,超限用分页 token;UI 层做差分刷新,避免主线程 GC 抖动

答案

“Health Connect 在国内目前只有海外 Pixel 设备预装,所以‘统一’必须做双端适配。我的做法是:
第一步,在 Gradle 中把 androidx.health:health-connect-client:1.1.0-alpha03 作为 compileOnly 依赖,避免在国产 ROM 直接崩溃;运行时通过 PackageManager#resolveContentProvider("com.google.android.apps.healthdata") 判断是否存在。
第二步,抽象一层 HealthDataRepository,定义挂起函数 readSteps(start, end): List<StepsRecord>。海外分支用 HealthConnectClient#readRecords,国内分支按厂商实例化:华为走 Health Kit 的 DataController.readTodaySummation,OPPO 走 HealthEngine#queryData;返回数据全部映射成统一 StepsRecord,保证 UI 无感知。
第三步,权限与合规:海外用 PermissionController.createRequestPermissionIntent 一次性申请;国内华为需跳转到 Health Kit 授权页,OPPO 需在 manifest 声明 com.oplus.health.permission.READ_STEPS 并申请白名单。所有敏感数据先写进 EncryptedFile,上传前再用 Keystore 签名,后台校验证书指纹,满足《个人信息保护法》第 29 条。
第四步,性能优化:后台读数用 WorkManager+setExpedited,间隔 15 min;批量写采用 insertRecords(records) 事务,减少 Binder 调用;查询超过 1 万条时分页,用 ChangesToken 做增量同步,16 ms 帧率内完成 UI Diff。
上线后我们在 Google Play 与华为应用市场双渠道发布,同一套代码覆盖 90% 以上机型,日活耗电仅增加 1.3%,通过工信部 223 项合规检测。”

拓展思考

  1. 如果明年 MIUI 也推出类似 Health Connect 的中央数据枢纽,如何做到“零代码”热插拔?
    答:在 HealthDataRepository 里用 ServiceLoader 动态加载 jar 插件,插件实现 HealthDataSource 接口;通过后台配置中心下发“xiaomi=true”开关,App 端下载插件后反射实例化,无需发版。

  2. Health Connect 的“隐私沙盒”路线会把数据再隔离一层,届时后台读取可能完全禁止,如何提前兼容?
    答:把核心算法下沉到用户端,用 Android 13 新 API OnDevicePersonalization 做联邦计算,只回传脱敏特征;同时本地训练 TensorFlow Lite 模型,云端仅接收梯度加密向量,符合 Google 未来 3 年隐私要求。