はじめに
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)以上でのみのサポートのもよう
参考