しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Androidで歩数を取得する

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>

参考URL

ヘルスコネクトを Android 14 に対応するメモ | Cookin

AndroidアプリでヘルスコネクトAPIを活用して歩数データを取得する方法|照井健司