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:

  • Odczyt na pierwszym planie: możesz normalnie odczytywać dane z Health Connect, gdy aplikacja jest na pierwszym planie. W takich przypadkach możesz użyć usługi na pierwszym planie, aby wykonać tę operację, jeśli użytkownik lub system umieści aplikację 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 między odczytami. Liczba kroków to często powtarzany pomiar na platformach związanych ze zdrowiem, aktywnością fizyczną i samopoczuciem. Health Connect pozwala w prosty sposób odczytywać i zapisywać dane o liczbie kroków.

Aby odczytać rekordy, utwórz plik ReadRecordsRequest i prześlij go podczas rozmowy telefonicznej (readRecords).

Ten przykład pokazuje, jak odczytać dane o liczbie 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 odczytać dane o liczbie kroków w tle 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
  ...
}

odczytywać wcześniej zapisane dane;

Jeśli aplikacja wcześniej zapisała w Health Connect jakieś rekordy, może je odczytać bez konieczności uzyskania uprawnień do odczytu tych konkretnych rekordów. Dotyczy to sytuacji, gdy po ponownym zainstalowaniu aplikacji aplikacja musi ponownie zsynchronizować się z Health Connect.

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

Poniższy przykład pokazuje, jak wskazać nazwę pakietu podczas odczytu rekordów kroków:

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
}

Ograniczenia odczytu

Domyślnie aplikacja może odczytywać dane z ostatnich 30 dni, jeśli przyznano jej odpowiednie uprawnienia. Dzięki uprawnieniom PERMISSION_READ_HEALTH_DATA_HISTORY Twoja aplikacja może odczytywać dane starsze niż 30 dni.

Ograniczenie 30 dni

Health Connect może odczytywać dane przez maksymalnie 30 dni przed otrzymaniem pierwszego uprawnienia.

Jeśli jednak użytkownik usunie Twoją aplikację, historia uprawnień zostanie utracona. Jeśli użytkownik ponownie zainstaluje aplikację i po raz kolejny przyzna jej uprawnienia, aplikacja będzie mogła odczytywać dane z Health Connect do 30 dni przed tą datą.

Przykład 30-dni

Jeśli użytkownik po raz pierwszy przyzna uprawnienia do odczytu Twojej aplikacji 30 marca 2023 r., najwcześniejsze dane, jakie aplikacja może odczytać, będą dostępne od 28 lutego 2023 r.

Użytkownik usuwa Twoją aplikację 10 maja 2023 r. Użytkownik decyduje się na ponowne zainstalowanie aplikacji 15 maja 2023 r. i przyznaje uprawnienia do odczytu. Najwcześniejsza data, z której aplikacja może odczytać dane, to 15 kwietnia 2023 r.

Odczytywanie danych starszych niż 30 dni

Jeśli chcesz odczytać dane starsze niż 30 dni, musisz użyć uprawnienia PERMISSION_READ_HEALTH_DATA_HISTORY. Bez tego uprawnienia próba odczytu pojedynczego rekordu starszego niż 30 dni spowoduje błąd. Za pomocą jednego z żądań dotyczących zakresu czasowego nie można też odczytywać danych starszych niż 30 dni.