원시 데이터 읽기

다음 예는 원시 데이터를 일반적인 워크플로의 일부로 읽는 방법을 보여줍니다.

데이터 읽기

헬스 커넥트를 사용하면 앱이 포그라운드와 백그라운드에 있을 때 앱이 데이터 스토어에서 데이터를 읽을 수 있습니다.

  • 포그라운드 읽기: 앱이 포그라운드에 있으면 일반적으로 헬스 커넥트에서 데이터를 읽을 수 있습니다. 이 경우 사용자 또는 시스템이 읽기 작업 중에 앱을 백그라운드에 배치하는 경우 포그라운드 서비스를 사용하여 이 작업을 실행하는 것이 좋습니다.

  • 백그라운드 읽기: 사용자에게 추가 권한을 요청하면 사용자 또는 시스템이 앱을 백그라운드에 배치한 후 데이터를 읽을 수 있습니다. 전체 백그라운드 읽기 예를 참고하세요.

헬스 커넥트의 걸음 수 데이터 유형은 측정 시점과 시점 사이에 사용자가 걸은 걸음 수를 포착합니다. 걸음 수는 건강, 피트니스, 웰빙 플랫폼에서 공통으로 측정되는 수치를 나타냅니다. 헬스 커넥트를 사용하면 걸음 수 데이터를 쉽게 읽고 쓸 수 있습니다.

기록을 읽으려면 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일이 지난 단일 레코드를 읽으려고 하면 오류가 발생합니다. 또한 기간 요청 중 하나를 사용하여 30일 이전의 데이터를 읽을 수 없습니다.