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,HeartRateRecordi 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:
- Zintegruj Health Connect, korzystając z odpowiedniej zależności.
- Utwórz instancję
HealthConnectClient. - Sprawdź, czy aplikacja implementuje procesy uprawnień w czasie działania na podstawie uprawnień zdrowotnych.
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:
BloodPressureRecord: reprezentuje pojedynczy odczyt ciśnienia krwi, w tym ciśnienie skurczowe i rozkurczowe oraz pozycję ciała.HeartRateRecord: reprezentuje serię pomiarów tętna.RestingHeartRateRecord: reprezentuje pojedynczy pomiar tętna spoczynkowego.BodyTemperatureRecord: reprezentuje pojedynczy odczyt temperatury ciała, w tym miejsce pomiaru.BloodGlucoseRecord: reprezentuje pojedynczy odczyt stężenia glukozy we krwi, w tym związek z posiłkiem i źródło próbki.OxygenSaturationRecord: reprezentuje pojedynczy odczyt saturacji krwi.RespiratoryRateRecord: reprezentuje pojedynczy pomiar częstości oddychania.
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:
- Ciśnienie krwi: uprawnienia do odczytu i zapisu danych w
BloodPressureRecord. - Tętno: uprawnienia do odczytu i zapisu w przypadku
HeartRateRecord. - Tętno spoczynkowe: uprawnienia do odczytu i zapisu danych
RestingHeartRateRecord. - Temperatura ciała: uprawnienia do odczytu i zapisu w przypadku
BodyTemperatureRecord. - Glukoza we krwi: uprawnienia do odczytu i zapisu dla
BloodGlucoseRecord. - Nasycenie krwi tlenem: uprawnienia do odczytu i zapisu w przypadku
OxygenSaturationRecord. - Częstość oddychania: uprawnienia do odczytu i zapisu w przypadku
RespiratoryRateRecord.
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) )
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.") } } }
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_PRESSUREandroid.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
insertRecordsz 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
WorkManagerdo 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 zclientRecordId, który już istnieje, Health Connect zignoruje duplikat lub zaktualizuje istniejący rekord zamiast tworzyć nowy. Ustawieniemetadata.clientRecordIdto 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ścistartTimeiendTimesą 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
- Zestaw narzędzi Health Connect: używaj tej aplikacji towarzyszącej, aby ręcznie sprawdzać rekordy, usuwać dane testowe i symulować zmiany w bazie danych. To najlepszy sposób na sprawdzenie, czy rekordy są prawidłowo przechowywane.
- Testy jednostkowe z użyciem
FakeHealthConnectClient: użyj biblioteki testowej, aby sprawdzić, jak aplikacja radzi sobie w sytuacjach skrajnych, takich jak cofnięcie uprawnień lub wyjątki interfejsu API, bez konieczności używania urządzenia fizycznego.
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 clientRecordId w Metadata 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. |