元データを読み取る

次の例は、一般的なワークフローの一環として元データを読み取る方法を示しています。

データを読み取る

ヘルスコネクトでは、アプリがフォアグラウンドとバックグラウンドの両方にあるときに、アプリがデータストアからデータを読み取ることができます。

  • フォアグラウンドの読み取り: 通常、アプリがフォアグラウンドにあるときにヘルスコネクトからデータを読み取ることができます。このような場合は、読み取りオペレーション中にユーザーまたはシステムによってアプリがバックグラウンドに移動された場合に備えて、フォアグラウンド サービスを使用してこのオペレーションを実行することを検討してください。

  • バックグラウンド読み取り: ユーザーに追加の権限をリクエストすることで、ユーザーまたはシステムがアプリをバックグラウンドに移行した後にデータを読み取ることができます。バックグラウンド読み取りの例をご覧ください。

ヘルスコネクトのデータの種類「歩数」では、各読み取りの間にユーザーが歩いた歩数が記録されます。歩数は、健康、フィットネス、ウェルネスのプラットフォームで共通の測定値を表します。ヘルスコネクトでは、歩数データの読み取りと書き込みが簡単にできます。

レコードを読み取るには、ReadRecordsRequest を作成し、readRecords の呼び出し時に指定します。

次の例は、特定期間内のユーザーの歩数データを読み取る方法を示しています。SensorManager を使用した詳細な例については、歩数データ ガイドをご覧ください。

suspend fun readStepsByTimeRange(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response = healthConnectClient.readRecords(
            ReadRecordsRequest(
                StepsRecord::class,
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
        for (stepRecord in response.records) {
            // Process each step record
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

バックグラウンド読み取りの例

バックグラウンドでデータを読み取るには、マニフェスト ファイルで次の権限を宣言します。

<application>
  <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
...
</application>

次の例は、WorkManager を使用して、特定の期間内のユーザーの歩数データをバックグラウンドで読み取る方法を示しています。

class ScheduleWorker(private val appContext: Context, workerParams: WorkerParameters):
    CoroutineWorker(appContext, workerParams) {

    override suspend fun doWork(): Result {
        // Read data and process it.
        ...

        // Return success indicating successful data retrieval
        return Result.success()
    }
}

if (healthConnectClient
    .features
    .getFeatureStatus(
    HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_IN_BACKGROUND
    ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {

    // Check if necessary permission is granted
    val grantedPermissions = healthConnectClient.permissionController.getGrantedPermissions()

    if (PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND !in grantedPermissions) {
        // Perform read in foreground
        ...
    } else {
        // Schedule the periodic work request in background
        val periodicWorkRequest = PeriodicWorkRequestBuilder<ScheduleWorker>(1, TimeUnit.HOURS)
            .build()

        WorkManager.getInstance(context).enqueueUniquePeriodicWork(
            "read_health_connect",
            ExistingPeriodicWorkPolicy.KEEP,
            periodicWorkRequest
        )
    }
} else {
  // Background reading is not available, perform read in foreground
  ...
}

以前に書き込まれたデータを読み取る

アプリが以前にヘルスコネクトにレコードを書き込んでいた場合は、そのレコードに対する読み取り権限がなくても、そのレコードをアプリで読み戻すことができます。これは、ユーザーによるインストール後にヘルスコネクトと再同期する必要があるシナリオに該当します。

このシナリオでデータを読み取るには、ReadRecordsRequestdataOriginFilter パラメータで、パッケージ名を DataOrigin オブジェクトとして指定する必要があります。

次の例は、歩数レコードを読み取るときにパッケージ名を指定する方法を示しています。

try {
    val response =  healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = StepsRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
            dataOriginFilter = setOf(DataOrigin("com.my.package.name"))
        )
    )
    for (record in response.records) {
        // Process each record
    }
} catch (e: Exception) {
    // Run error handling here
}

読み取り制限

デフォルトでは、アプリは付与された権限で最大 30 日間遡ってデータを読み取ることができます。PERMISSION_READ_HEALTH_DATA_HISTORY 権限を使用すると、アプリは 30 日以上前のデータを読み取ることができます。

30 日間の制限

ヘルスコネクトでは、最初に権限が付与されたときから最大 30 日間遡ってデータを読み取れます。

ただし、ユーザーがアプリを削除すると、権限履歴は失われます。ユーザーがアプリを再インストールして権限を再度付与すると、その新しい日付から最大 30 日間遡って、アプリがヘルスコネクトからデータを読み取れます。

30 日間の例

ユーザーが 2023 年 3 月 30 日に初めてアプリに読み取り権限を許可した場合、アプリは 2023 年 2 月 28 日以降のデータを読み取れます。

その後、ユーザーは 2023 年 5 月 10 日にアプリを削除しました。ユーザーは 2023 年 5 月 15 日にアプリを再インストールし、読み取り権限を許可しました。この場合、アプリは 2023 年 4 月 15 日以降のデータを読み取れます。

30 日以上前のデータを読み取る

30 日以上前のデータを読み取る場合は、PERMISSION_READ_HEALTH_DATA_HISTORY 権限を使用する必要があります。この権限がない場合、30 日以上経過した 1 つのレコードを読み取ろうとするとエラーになります。また、いずれかの期間リクエストを使用して 30 日より古いデータを読み取ることもできません。