Tworzenie funkcji związanych z danymi o stanie zdrowia za pomocą Health Connect

Jeśli chcesz utworzyć aplikację do zarządzania danymi o zdrowiu użytkowników, możesz użyć Health Connect do takich czynności jak:

  • Odczytywanie danych o parametrach życiowych, takich jak ciśnienie krwi, tętno i temperatura ciała, z innych aplikacji
  • Zapisywanie danych o parametrach życiowych zarejestrowanych przez aplikację lub połączone urządzenia
  • monitorować trendy i dostarczać statystyki dotyczące zdrowia na podstawie danych o parametrach życiowych,

Z tego przewodnika dowiesz się, jak pracować z typami danych o parametrach życiowych, w tym o uprawnieniach, procesach odczytu i zapisu oraz sprawdzonych metodach.

Omówienie: tworzenie kompleksowego narzędzia do śledzenia sygnałów

Aby utworzyć kompleksowe śledzenie danych o stanie zdrowia za pomocą Health Connect, wykonaj te podstawowe czynności:

  • Prośba o odpowiednie uprawnienia do typów danych dotyczących parametrów życiowych.
  • Zapisywanie danych o parametrach życiowych za pomocą rekordów takich jak BloodPressureRecord, HeartRateRecord i innych rekordów dotyczących parametrów życiowych.
  • Odczytywanie danych o funkcjach życiowych w celu wyświetlania, analizowania lub synchronizowania.
  • Używanie przetwarzania wsadowego do efektywnego zapisywania i odczytywania danych.

Ten proces umożliwia interoperacyjność z innymi aplikacjami Health Connect i weryfikuje dostęp do danych kontrolowany przez użytkownika.

Zanim zaczniesz

Przed wdrożeniem funkcji dotyczących parametrów życiowych:

Kluczowych pojęć

Dane o parametrach życiowych w Health Connect są reprezentowane przez różne typy rekordów, z których każdy odpowiada konkretnemu pomiarowi fizjologicznemu. W przeciwieństwie do sesji treningowych dane dotyczące funkcji życiowych są często rejestrowane jako dane punktowe lub oparte na przedziałach.

Typy danych o parametrach życiowych

Dane dotyczące stanu zdrowia są reprezentowane przez poszczególne typy rekordów. Typowe typy to:

Pełną listę typów danych znajdziesz w artykule Typy danych w Health Connect.

Uwagi dotyczące programowania

Dane dotyczące parametrów życiowych mogą być wrażliwe, a aplikacje mogą zapisywać dane w odpowiedzi na pomiary z czujników lub dane wejściowe użytkownika albo synchronizować dane z backendu. Uprawnienia są kluczowe w przypadku obsługi danych o funkcjach życiowych.

Uprawnienia

Przed odczytaniem lub zapisaniem danych o parametrach życiowych aplikacja musi poprosić o odpowiednie uprawnienia Health Connect. Typowe uprawnienia dotyczące parametrów życiowych to ciśnienie krwi, tętno, temperatura ciała, glukoza we krwi, nasycenie tlenem i częstość oddychania. między innymi na następujące działania:

Poniżej znajdziesz przykład żądania uprawnień do pomiaru ciśnienia krwi, tętna i temperatury ciała:

Po utworzeniu instancji klienta aplikacja musi poprosić użytkownika o uprawnienia. Użytkownicy muszą mieć możliwość przyznania lub odmowy przyznania uprawnień w dowolnym momencie. Aby to zrobić, utwórz zestaw uprawnień dla wymaganych typów danych. Najpierw sprawdź, czy uprawnienia w zestawie są zadeklarowane w pliku manifestu Androida.

val permissions =
    setOf(
        HealthPermission.getReadPermission(BloodPressureRecord::class),
        HealthPermission.getWritePermission(BloodPressureRecord::class),
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class),
        HealthPermission.getReadPermission(BodyTemperatureRecord::class),
        HealthPermission.getWritePermission(BodyTemperatureRecord::class)
    )
Użyj getGrantedPermissions, aby sprawdzić, czy Twoja aplikacja ma już przyznane wymagane uprawnienia. Jeśli nie, użyj createRequestPermissionResultContract aby poprosić o te uprawnienia. Wyświetli się ekran uprawnień Health Connect.
val permissions = setOf(
        HealthPermission.getReadPermission(StepsRecord::class),
        HealthPermission.getWritePermission(StepsRecord::class),
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class)
    )

val requestPermissionsLauncher = rememberLauncherForActivityResult(
    contract = PermissionController.createRequestPermissionResultContract()
) { grantedPermissions ->
    if (grantedPermissions.containsAll(permissions)) {
        coroutineScope.launch { snackbarHostState.showSnackbar("Permissions granted!") }
    } else {
        coroutineScope.launch { snackbarHostState.showSnackbar("Permissions denied.") }
    }
}
Użytkownicy mogą w każdej chwili przyznać lub cofnąć uprawnienia, dlatego aplikacja musi sprawdzać uprawnienia za każdym razem przed ich użyciem i obsługiwać sytuacje, w których uprawnienia zostaną utracone.

Aby poprosić o uprawnienia, wywołaj funkcję checkPermissionsAndRun:

if (!granted.containsAll(permissions)) {
    // Check if required permissions are not granted, and return
    return emptySet()
}
// Permissions already granted; proceed with inserting or reading data

Jeśli musisz poprosić o uprawnienia tylko do jednego typu danych, np. ciśnienia krwi, uwzględnij w zestawie uprawnień tylko ten typ danych:

Dostęp do danych o ciśnieniu krwi jest chroniony przez te uprawnienia:

  • android.permission.health.READ_BLOOD_PRESSURE
  • android.permission.health.WRITE_BLOOD_PRESSURE

Aby dodać do aplikacji funkcję pomiaru ciśnienia krwi, zacznij od poproszenia o uprawnienia do typu danych BloodPressureRecord.

Aby móc zapisywać dane dotyczące ciśnienia krwi, musisz zadeklarować to uprawnienie:

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

Aby odczytać ciśnienie krwi, musisz poprosić o te uprawnienia:

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

Zapisywanie danych o funkcjach życiowych

W tej sekcji opisujemy, jak zapisywać dane dotyczące funkcji życiowych w Health Connect. Dane dotyczące parametrów życiowych są zwykle zapisywane jako poszczególne rekordy. Jeśli zapisujesz wiele rekordów naraz, np. synchronizując dane z czujnika lub backendu, użyj przetwarzania wsadowego.

Przykład pisania BloodPressureRecord:

suspend fun writeBloodPressureRecord(healthConnectClient: HealthConnectClient) {
    val record = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST
    )
    healthConnectClient.insertRecords(listOf(record))
}

Pisanie wsadowe

Jeśli aplikacja musi zapisywać wiele punktów danych, np. synchronizować dane z połączonego urządzenia lub usługi backendu, warto grupować zapisy, aby zwiększyć wydajność i zmniejszyć zużycie baterii. Health Connect może obsłużyć do 1000 rekordów w ramach jednego żądania zapisu.

Poniższy kod pokazuje, jak zbiorczo zapisać kilka rekordów naraz:

suspend fun writeBatchRecords(healthConnectClient: HealthConnectClient) {
    val bloodPressureRecord = BloodPressureRecord(
        time = Instant.now(),
        zoneOffset = ZoneOffset.UTC,
        systolic = Pressure.millimetersOfMercury(120.0),
        diastolic = Pressure.millimetersOfMercury(80.0),
        bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN,
        measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST
    )
    val heartRateRecord = HeartRateRecord(
        startTime = Instant.now().minusSeconds(60),
        startZoneOffset = ZoneOffset.UTC,
        endTime = Instant.now(),
        endZoneOffset = ZoneOffset.UTC,
        samples = listOf(HeartRateRecord.Sample(time = Instant.now().minusSeconds(30), beatsPerMinute = 80))
    )
    healthConnectClient.insertRecords(listOf(bloodPressureRecord, heartRateRecord))
}

Odczytywanie danych o parametrach życiowych

Aplikacje mogą odczytywać dane o parametrach życiowych, aby wyświetlać pomiary, analizować trendy lub synchronizować dane z serwerem zewnętrznym. Aby odczytać dane dotyczące stanu zdrowia, użyj ReadRecordsRequest z określonym typem rekordu i filtruj według zakresu czasu.

Przykład odczytywania danych BloodPressureRecord:

suspend fun readBloodPressureRecords(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    val response = healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = BloodPressureRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )

    for (record in response.records) {
        // Process each blood pressure record
        val systolic = record.systolic
        val diastolic = record.diastolic
    }
}

Jeśli musisz zsynchronizować dane o parametrach życiowych z serwerem backendu lub aktualizować bazę danych aplikacji za pomocą Health Connect, użyj ChangeLogs. Umożliwia to pobieranie listy wstawionych, zaktualizowanych lub usuniętych rekordów od określonego momentu, co jest bardziej wydajne niż ręczne śledzenie zmian lub wielokrotne odczytywanie wszystkich danych. Więcej informacji znajdziesz w artykule Synchronizowanie danych z Health Connect.

Sprawdzone metody

Aby zwiększyć wiarygodność danych i poprawić komfort użytkowników, postępuj zgodnie z tymi wskazówkami:

  • Żądania zapisu zbiorczego: aby zmniejszyć obciążenie wejścia/wyjścia i wydłużyć czas pracy baterii, grupuj punkty danych w jedno wywołanie insertRecords z grupami zawierającymi maksymalnie 1000 rekordów, zamiast zapisywać każdy punkt osobno.
  • Częste zapisywanie podczas śledzenia na żywo: w przypadku częstych aktualizacji z czujników (np. ciągłych monitorów glukozy lub pulsometrów) zapisuj dane w partiach w odstępach do 15 minut, aby zachować równowagę między aktualizacjami w czasie rzeczywistym a wydajnością baterii.
  • Używaj WorkManagera do synchronizacji w tle: używaj WorkManager do odroczonych zapisów, np. synchronizowania danych z urządzenia towarzyszącego lub usługi backendu. W przypadku zapisów wsadowych staraj się zachować 15-minutowy interwał.
  • Unikaj zapisywania zduplikowanych danych: używaj identyfikatorów klienta: podczas tworzenia rekordów ustaw metadata.clientRecordId. Health Connect używa tego identyfikatora do identyfikowania unikalnych rekordów. Jeśli spróbujesz zapisać rekord z clientRecordId, który już istnieje, Health Connect zignoruje duplikat lub zaktualizuje istniejący rekord zamiast tworzyć nowy. Ustawienie metadata.clientRecordId to najskuteczniejszy sposób zapobiegania duplikatom podczas ponawiania synchronizacji lub ponownej instalacji aplikacji.
    val record = StepsRecord(
        count = 100,
        startTime = startTime,
        endTime = endTime,
        startZoneOffset = ZoneOffset.UTC,
        endZoneOffset = ZoneOffset.UTC,
        metadata = Metadata(
            // Use a unique ID from your own database
            clientRecordId = "daily_steps_2023_10_27_user_123"
        )
    )
  • Sprawdź istniejące dane: przed zsynchronizowaniem danych wyślij do Health Connect zapytanie o rekordy w zakresie czasu synchronizacji, aby sprawdzić, czy dane z aplikacji już istnieją. Pozwoli to uniknąć duplikatów lub zastąpienia nowszych danych.
  • Podaj jasne uzasadnienie uprawnień: użyj Permission.createIntent, aby wyjaśnić, dlaczego Twoja aplikacja potrzebuje dostępu do danych o zdrowiu, np. „Aby monitorować trendy ciśnienia krwi i dostarczać Ci informacji”.
  • Dopasuj sygnatury czasowe do pomiarów: sprawdź, czy sygnatury czasowe rekordów dokładnie odzwierciedlają momenty, w których dokonano pomiarów. W przypadku danych interwałowych, takich jak HeartRateRecord, sprawdź, czy wartości startTimeendTime są prawidłowe.

Testowanie

Aby sprawdzić poprawność danych i zapewnić wysoką jakość obsługi, postępuj zgodnie z tymi strategiami testowania i zapoznaj się z oficjalną dokumentacją Testowanie najważniejszych przypadków użycia.

Narzędzia do weryfikacji

Lista kontrolna jakości

Typowa architektura

Implementacja wskaźników zwykle obejmuje:

Komponent Zarządza
Kontroler Vitals Logika grupowania danych z czujników lub wejść
Warstwa repozytorium (zawiera operacje Health Connect): Wstawianie rekordów dotyczących parametrów życiowych
Odczytywanie rekordów dotyczących parametrów życiowych
Warstwa interfejsu (wyświetlacze): Odczyty na żywo
Dane historyczne
Wykresy i trendy

Rozwiązywanie problemów

Krótki opis problemu Możliwa przyczyna Rozdzielczość
Brakujące typy danych (np. ciśnienie krwi) Brak uprawnień do zapisu lub nieprawidłowe filtry czasu. Sprawdź, czy masz uprawnienia do określonego typu danych i czy użytkownik je przyznał. Sprawdź, czy ReadRecordsRequest korzysta z TimeRangeFilter, który obejmuje czas pomiaru. Zobacz Uprawnienia.
Wyświetlają się zduplikowane rekordy Brak clientRecordId. Przypisz unikalny clientRecordIdMetadata każdego rekordu. Dzięki temu Health Connect może usuwać duplikaty, jeśli te same dane zostaną zapisane 2 razy podczas ponownej próby synchronizacji. Zobacz sprawdzone metody.
Nie udało się zapisać rekordów Nieprawidłowe jednostki lub wartości spoza prawidłowego zakresu. Health Connect weryfikuje wartości rekordów. Na przykład wartości ciśnienia krwi muszą mieścić się w fizjologicznie prawdopodobnym zakresie. Informacje o prawidłowych zakresach i jednostkach znajdziesz w dokumentacji typu danych.

Typowe czynności debugowania

Sprawdź stan uprawnień. Zawsze wywołuj funkcję getPermissionStatus() przed podjęciem próby odczytu lub zapisu. Użytkownicy mogą w dowolnym momencie cofnąć uprawnienia w ustawieniach systemu.