Odczyt nieprzetworzonych danych

Ten przykład pokazuje, jak odczytać dane nieprzetworzone w ramach typowego procesu.

.

Odczytywanie danych

Health Connect umożliwia aplikacjom odczytywanie danych z magazynu danych, gdy aplikacja jest na pierwszym planie i w tle:

  • Odczytywanie na pierwszym planie: dane z Health Connect możesz odczytywać normalnie, gdy aplikacja jest na pierwszym planie. W takich przypadkach możesz rozważyć użycie usługi na pierwszym planie do wykonania tej operacji, jeśli użytkownik lub system przeniesie Twoją aplikację do działania w tle podczas operacji odczytu.

  • Odczytywanie w tle: jeśli poprosisz użytkownika o dodatkowe uprawnienia, możesz odczytywać dane po umieszczeniu aplikacji przez użytkownika lub system w tle. Zobacz pełny przykład odczytu w tle.

Typ danych Kroki w Health Connect rejestruje liczbę kroków wykonanych przez użytkownika pomiędzy odczytami. Liczba kroków to wspólny pomiar na platformach dotyczących zdrowia, fitnessu i wellness. Health Connect ułatwia odczytywanie i zapisywanie danych o liczbie kroków.

Aby odczytać rekordy, utwórz plik ReadRecordsRequest i podaj go podczas wywołania funkcji readRecords.

Ten przykład pokazuje, jak odczytać dane dotyczące liczby kroków użytkownika w określonym czasie. Pełny przykład z użyciem SensorManager znajdziesz w przewodniku dotyczącym danych liczba kroków.

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
    }
}

Przykład odczytywania w tle

Aby odczytywać dane w tle, w pliku manifestu zadeklaruj to uprawnienie:

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

Ten przykład pokazuje, jak odczytywać dane o liczbie kroków w tle w przypadku użytkownika w określonym czasie za pomocą funkcji 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
  ...
}

Parametr ReadRecordsRequest ma domyślną wartość pageSize 1000. Jeśli liczba rekordów w pojedynczym readResponse przekracza pageSize w żądaniu, musisz przejrzeć wszystkie strony odpowiedzi, aby pobrać wszystkie rekordy, używając pageToken. Pamiętaj jednak, aby nie przekraczać limitów.

Przykład odczytu parametru pageToken

Zalecamy użycie metody pageToken do odczytu rekordów w celu pobrania wszystkich dostępnych danych z wybranego przedziału czasu.

Ten przykład pokazuje, jak odczytać wszystkie rekordy, dopóki nie zostaną wyczerpane wszystkie tokeny strony:

val type = HeartRateRecord::class
val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofDays(7))

try {
    var pageToken: String? = null
    do {
        val readResponse =
            healthConnectClient.readRecords(
                ReadRecordsRequest(
                    recordType = type,
                    timeRangeFilter = TimeRangeFilter.between(
                        startTime,
                        endTime
                    ),
                    pageToken = pageToken
                )
            )
        val records = readResponse.records
        // Do something with records
        pageToken = readResponse.pageToken
    } while (pageToken != null)
} catch (quotaError: IllegalStateException) {
    // Backoff
}

Więcej informacji o sprawdzonym sposobie odczytywania dużych zbiorów danych znajdziesz w artykule Planowanie, aby uniknąć ograniczania szybkości.

odczytywać wcześniej zapisane dane,

Jeśli aplikacja wcześniej zapisywała dane w Health Connect, może odczytać dane historyczne. Dotyczy to sytuacji, w których aplikacja musi ponownie zsynchronizować się z Health Connect po ponownym zainstalowaniu przez użytkownika.

Obowiązują pewne ograniczenia dotyczące odczytu:

  • Android 14 lub nowszy

    • Brak limitu historycznego w przypadku aplikacji odczytującej własne dane.
    • 30-dniowy limit na odczytywanie przez aplikację innych danych.
  • Android 13 lub starszy

    • 30-dniowy limit na czytanie przez aplikację jakichkolwiek danych.

Ograniczenia można usunąć, prosząc o uprawnienia dostępu do odczytu.

Aby odczytać dane historyczne, musisz wskazać nazwę pakietu jako obiekt DataOrigin w parametrze dataOriginFilterReadRecordsRequest.

Ten przykład pokazuje, jak wskazać nazwę pakietu podczas odczytu rekordów Steps:

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
}

odczytywać dane starsze niż 30 dni;

Domyślnie wszystkie aplikacje mogą odczytywać dane z Health Connect przez 30 dni przed przyznaniem uprawnień.

Jeśli musisz rozszerzyć uprawnienia do odczytu poza domyślne ograniczenia, poproś o to: PERMISSION_READ_HEALTH_DATA_HISTORY. W przeciwnym razie bez tego uprawnienia próba odczytu rekordów starszych niż 30 dni spowoduje błąd.

Historia uprawnień usuniętych aplikacji

Jeśli użytkownik usunie Twoją aplikację, wszystkie uprawnienia, w tym uprawnienie do historii, zostaną cofnięte. Jeśli użytkownik ponownie zainstaluje aplikację i po raz kolejny udzieli jej uprawnień, będą miały zastosowanie te same domyślne ograniczenia, a aplikacja będzie mogła odczytywać dane z Health Connect przez maksymalnie 30 dni przed tą nową datą.

Załóżmy na przykład, że użytkownik usuwa Twoją aplikację 10 maja 2023 r., a potem ponownie ją instaluje 15 maja 2023 r. i przyznaje uprawnienia do odczytu. Najwcześniejsza data, z której aplikacja może teraz domyślnie odczytywać dane, to 15 kwietnia 2023 r.