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

Jeśli chcesz utworzyć aplikację do zarządzania danymi o stanie zdrowia 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
  • Monitorowanie trendów i dostarczanie informacji o zdrowiu na podstawie danych o parametrach życiowych

Z tego przewodnika dowiesz się, jak pracować z typami danych o parametrach życiowych, w tym jak zarządzać uprawnieniami, odczytywać i zapisywać dane oraz stosować sprawdzone metody.

Omówienie: tworzenie kompleksowego narzędzia do śledzenia parametrów życiowych

Aby utworzyć kompleksowe śledzenie parametrów życiowych 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 parametrach ż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

Zanim wdrożysz funkcje dotyczące podstawowych informacji:

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 parametry życiowe są często rejestrowane jako dane punktowe lub oparte na przedziałach.

Typy danych o parametrach życiowych

Dane o parametrach życiowych są reprezentowane przez poszczególne typy rekordów. Typowe rodzaje:

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 parametrach ż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 obejmują ciśnienie krwi, tętno, temperaturę ciała, poziom glukozy 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. Sprawdź, czy uprawnienia w zestawie są najpierw zadeklarowane w pliku manifestu Androida.

// Create a set of permissions for required data types
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.

// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()

val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions successfully granted
  } else {
    // Lack of required permissions
  }
}

suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
  val granted = healthConnectClient.permissionController.getGrantedPermissions()
  if (granted.containsAll(PERMISSIONS)) {
    // Permissions already granted; proceed with inserting or reading data
  } else {
    requestPermissions.launch(PERMISSIONS)
  }
}

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)) {
    requestPermissions.launch(PERMISSIONS)
    // Check if required permissions are not granted, and return
  }
// 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 parametrach życiowych

W tej sekcji opisujemy, jak zapisywać dane o parametrach życiowych w Health Connect. Dane dotyczące parametrów życiowych są zwykle zapisywane jako pojedyncze rekordy. Jeśli zapisujesz jednocześnie wiele rekordów, np. synchronizujesz 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 zapisywać je partiami, 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 zapisywać wiele 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 funkcjach życiowych

Aplikacje mogą odczytywać dane o parametrach życiowych, aby wyświetlać pomiary, analizować trendy lub synchronizować dane z serwerem zewnętrznym. Aby odczytać parametry życiowe, 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 chcesz synchronizować dane o parametrach życiowych z serwerem backendu lub aktualizować magazyn 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ć wygodę użytkowników, postępuj zgodnie z tymi wskazówkami:

  • Częstotliwość zapisu i grupowanie: aby zmniejszyć obciążenie wejścia/wyjścia i wydłużyć czas pracy na baterii, grupuj punkty danych w jedno wywołanie insertRecords z partiami zawierającymi do 1000 rekordów, zamiast zapisywać każdy punkt osobno.
    • Śledzenie na żywo: w przypadku częstych aktualizacji z czujników (np. ciągłych monitorów glukozy lub monitorów tętna) zapisuj dane w partiach w odstępach do 15 minut, aby zachować równowagę między aktualizacjami w czasie rzeczywistym a wydajnością baterii.
    • Synchronizacja 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 zbiorczych staraj się zachować 15-minutowy odstęp.
  • Unikaj zapisywania zduplikowanych danych: używaj identyfikatorów klientów. Podczas tworzenia rekordów ustaw wartość 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.clientRecordIdto najskuteczniejszy sposób zapobiegania duplikatom podczas ponownych prób synchronizacji lub ponownej instalacji aplikacji.

    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,
        metadata = Metadata(
            // Use a unique ID from your own database
            clientRecordId = "bp_20240101_user123"
        )
    )
  • Sprawdź istniejące dane: przed synchronizacją danych wyślij do Health Connect zapytanie o rekordy w zakresie czasu synchronizacji, aby sprawdzić, czy dane z Twojej aplikacji już istnieją. Pozwoli to uniknąć duplikatów lub zastąpienia nowszych danych.

  • Podaj jasne uzasadnienie uprawnień: użyj procesu 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ą czas wykonania 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 parametrów życiowych zwykle obejmuje:

Komponent Zarządza
Kontroler Vitals Odczyt z czujnika lub wejścia
Logika grupowania
Warstwa repozytorium (zawiera operacje Health Connect): Wstawianie rekordów dotyczących funkcji życiowych
Odczytywanie rekordów dotyczących funkcji ż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.
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.
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 dwukrotnie podczas ponownej próby synchronizacji. Zobacz sprawdzone metody.

Typowe czynności debugowania

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