はじめに
Wear OS 搭載スマートウォッチに心拍数を表示したい。その方法を調べた
方法
調べたところ、以下の3つの方法があるもよう
- 
Google Fit API 
 2024年末でサポート終了とのこと
- 
Health Services 
 Google Fit API に代わる方法で Google は今後これを推していきたいように見える
- 
センサー利用 
今回は Health Services を利用して心拍数を表示してみる
実装
ライブラリ追加
build.gradle.kts
  implementation "androidx.health:health-services-client:1.1.0-alpha02"
まだ alpha 版のもよう
権限追加
AndroidManifest.xml
    <uses-permission android:name="android.permission.BODY_SENSORS" />
権限取得処理
実行時に android.Manifest.permission.BODY_SENSORS の権限取得処理必要
(実装例略)
HealthServiceClient 取得
    private val healthClient: HealthServicesClient by lazy { HealthServices.getClient(getApplication()) }
コールバック処理実装
    private val heartRateCallback = object : MeasureCallback {
        override fun onAvailabilityChanged(dataType: DeltaDataType<*, *>, availability: Availability) {
            if (availability is DataTypeAvailability) {
                Timber.d("dataType: $dataType, availability: $availability")
            }
        }
        override fun onDataReceived(data: DataPointContainer) {
            val heartRate: Double = (data.sampleDataPoints.firstOrNull()?.value as Double?) ?: 0.0
            // ここで取得した心拍数を利用!!
            Timber.d("heart rate: $heartRate")
        }
        override fun onRegistered() {
            super.onRegistered()
            Timber.d("onRegistered()")
        }
        override fun onRegistrationFailed(throwable: Throwable) {
            super.onRegistrationFailed(throwable)
            Timber.d("onRegistrationFailed throwable: $throwable")
        }
    }
コールバック登録/解除
    // 登録
    healthClient.measureClient.registerMeasureCallback(DataType.Companion.HEART_RATE_BPM, heartRateCallback)
    ...
            
    // 解除
    healthClient.measureClient.unregisterMeasureCallbackAsync(DataType.Companion.HEART_RATE_BPM, heartRateCallback)
実際はコールバック登録時に android.Manifest.permission.BODY_SENSORS の権限チェック&権限取得処理が必要
実行
Pixel Watch を腕に身に付けてアプリを起動したら、心拍数が表示された 
 
割と頻繁に(数秒毎に)数値が更新されて良い感じ 
注意
- Health Services は Wear OS 3(SdkVersion 30)以上でのみのサポートのもよう
参考
