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,HeartRateRecordi 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:
- Zintegruj Health Connect, korzystając z odpowiedniej zależności.
- Utwórz instancję
HealthConnectClient. - Sprawdź, czy aplikacja implementuje przepływy uprawnień w czasie działania na podstawie uprawnień związanych ze zdrowiem.
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:
BloodPressureRecord: reprezentuje pojedynczy pomiar 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 nasycenia krwi tlenem.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 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:
- Ciśnienie krwi: uprawnienia do odczytu i zapisu danych
BloodPressureRecord. - Tętno: uprawnienia do odczytu i zapisu w przypadku
HeartRateRecord. - Tętno spoczynkowe: uprawnienia do odczytu i zapisu w przypadku
RestingHeartRateRecord. - Temperatura ciała: uprawnienia do odczytu i zapisu w przypadku
BodyTemperatureRecord. - Glukoza we krwi: uprawnienia do odczytu i zapisu dla
BloodGlucoseRecord. - Nasycenie tlenem: uprawnienia do odczytu i zapisu w przypadku
OxygenSaturationRecord. - Częstość oddechów: 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. 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_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 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
insertRecordsz 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
WorkManagerdo 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 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 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ś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 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 clientRecordId w Metadata 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.