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:

  • Odczyty na pierwszym planie: dane z Health Connect można zazwyczaj odczytywać, gdy aplikacja działa 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. Rozszerzony przykład z wykorzystaniem SensorManager znajdziesz w przewodniku po danych dotyczących liczby 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
  ...
}

Odczytywanie wcześniej zapisanych danych

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, w których aplikacja musi ponownie zsynchronizować się z Health Connect po ponownym zainstalowaniu jej przez użytkownika.

Aby odczytać dane w tym scenariuszu, 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
}

Ograniczenia odczytu

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

30-dniowe ograniczenie

Health Connect może odczytywać dane do 30 dni przed przyznaniem uprawnień.

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ł Twojej aplikacji uprawnienia do odczytu 30 marca 2023 r., najstarsze dane, które Twoja aplikacja może odczytać, pochodzą z 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.

odczytywać dane starsze 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. Nie możesz też odczytać żadnych danych starszych niż 30 dni za pomocą żadnego z tych zapytań dotyczących zakresu czasowego.