Androidで当日の歩数の取得を試してみました
今回は下のドキュメントを参照しました
ヘルスコネクトを使ってみる | Android health & fitness | Android Developers
歩数の取得はヘルスコネクトという機能を利用しました
こちらを使うと健康系のデータを簡単に取得できるようです
今まではGoogleFit APIで歩数を取得するのが主流だったのですが、こちらが非推奨になるヘルスコネクトが推奨になりました
ヘルスコネクト | Android health & fitness | Android Developers
まずはbuild.grandleにライブラリを追加します
dependencies {
implementation("androidx.health.connect:connect-client:1.1.0-alpha02")
}
次はAndroidManifest.xmlに権限を追加します
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.health.READ_STEPS"/> <uses-permission android:name="android.permission.health.WRITE_STEPS" /> </ manifest>
次はヘルスコネクトのクライアントを使うためにAndroidManifest.xmlにqueriesを追加します
queriesは他アプリのインストール状況を調べたりする時に利用するタグです
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application></application> <queries> <package android:name="com.google.android.apps.healthdata" /> </queries> </manifest>
次は歩数の権限取得処理を実装します
処理は下の通りです、ユーザーが許可をすればgrantedに許可済みの権限が入ります
val permissions = setOf( HealthPermission.getReadPermission(StepsRecord::class), HealthPermission.getWritePermission(StepsRecord::class) ) val resultContract = PermissionController.createRequestPermissionResultContract() val requestPermissions = registerForActivityResult(resultContract) { granted -> if (granted.containsAll(permissions)) { } else { } } requestPermissions.launch(permissions)
許可アラートは下のようなものです
ただ実機だとこちらは表示できずgrantedは空の配列が入っていました
もしかすると実機はデバッグ版だと動かないのかもしれません
次は歩数の登録をします
登録処理は下の通りです
val stepsRecord = StepsRecord( count = 120, startTime = Instant.now().minusSeconds(3600), endTime = Instant.now(), startZoneOffset = ZoneOffset.ofHours(9), endZoneOffset = ZoneOffset.ofHours(9) ) val response = healthConnectClient.insertRecords(listOf(stepsRecord))
次は今日の歩数を取得してみます
当日の歩数の取得方法は下の通りです
aggregateGroupByPeriodで日付ごとの歩数を取るようにしています
val startTime = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0) val endTime = startTime.plusDays(1) val request = AggregateGroupByPeriodRequest( metrics = setOf(StepsRecord.COUNT_TOTAL), timeRangeFilter = TimeRangeFilter.between(startTime, endTime), timeRangeSlicer = Period.ofDays(1) ) val results = healthConnectClient.aggregateGroupByPeriod(request) results.forEach { result -> val step = result.result[StepsRecord.COUNT_TOTAL] ?: 0 }
ヘルスコネクトを使う場合、ユーザーがヘルスコネクトにいつでもアクセスして権限のON/OFFを変えれるようにする必要があります
ボタンを押した時に下の形でヘルスコネクトへ遷移する実装を追加しました
val intent = Intent(HealthConnectClient.ACTION_HEALTH_CONNECT_SETTINGS)
startActivity(intent)
Android13まではヘルスコネクトがデフォルトで入ってないので下方法でインストールされているかチェックする必要があります
val isAvailable = HealthConnectClient.getSdkStatus(this) == HealthConnectClient.SDK_AVAILABLE
ヘルスコネクトを使う場合、プライバシーポリシーを表示するActivityを追加して下のようにAndroidManifest.xmlに登録する必要があります
<manifest> <application> <activity android:name=".PermissionsRationaleActivity" android:exported="false" android:label="@string/title_activity_permissions_rationale" android:theme="@style/Theme.Example"> <intent-filter> <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" /> </intent-filter> </activity> <!-- For versions starting Android 14, create an activity alias to show the rationale of Health Connect permissions once users click the privacy policy link. --> <activity-alias android:name=".ViewPermissionUsageActivity" android:exported="true" android:permission="android.permission.START_VIEW_PERMISSION_USAGE" android:targetActivity=".PermissionsRationaleActivity"> <intent-filter> <action android:name="android.intent.action.VIEW_PERMISSION_USAGE" /> <category android:name="android.intent.category.HEALTH_PERMISSIONS" /> </intent-filter> </activity-alias> </application> </manifest>