Vitals-Funktionen mit Health Connect entwickeln

Wenn Sie eine App entwickeln möchten, mit der Nutzer ihre Vitalparameter verwalten können, können Sie mit Health Connect Folgendes tun:

  • Vitalparameter wie Blutdruck, Herzfrequenz und Körpertemperatur aus anderen Apps lesen
  • Vitalparameter schreiben, die von Ihrer App oder verbundenen Geräten erfasst wurden
  • Trends beobachten und auf Grundlage von Vitalparametern Gesundheitsinformationen bereitstellen

In dieser Anleitung wird beschrieben, wie Sie mit Datentypen für Vitalparameter arbeiten. Dabei werden Berechtigungen, Lese- und Schreibvorgänge sowie Best Practices behandelt.

Übersicht: Umfassende Erfassung von Vitalparametern

Mit Health Connect können Sie eine umfassende Erfassung von Vitalparametern erstellen. Dazu sind folgende Schritte erforderlich:

  • Die entsprechenden Berechtigungen für Datentypen für Vitalparameter anfordern.
  • Vitalparameter mit Datensätzen wie BloodPressureRecord, HeartRateRecord und anderen Datensätzen für Vitalparameter schreiben.
  • Vitalparameter zur Anzeige, Analyse oder Synchronisierung lesen.
  • Batching für effizientes Schreiben und Lesen von Daten verwenden.

Dieser Workflow ermöglicht die Interoperabilität mit anderen Health Connect-Apps und überprüft den nutzergesteuerten Datenzugriff.

Hinweis

Vor der Implementierung von Funktionen für Vitalparameter:

Schlüsselkonzepte

Vitalparameter in Health Connect werden durch verschiedene Datensatztypen dargestellt, die jeweils einer bestimmten physiologischen Messung entsprechen. Im Gegensatz zu Trainingseinheiten werden Vitalparameter oft als Daten zu einem bestimmten Zeitpunkt oder als intervallbasierte Daten erfasst.

Datentypen für Vitalparameter

Vitalparameter werden durch einzelne Datensatztypen dargestellt. Häufige Typen sind:

Eine vollständige Liste der Datentypen finden Sie unter Health Connect-Datentypen.

Überlegungen zur Entwicklung

Vitalparameter können sensibel sein. Apps müssen möglicherweise Daten als Reaktion auf Messungen von Sensoren oder Nutzereingaben schreiben oder Daten aus einem Backend synchronisieren. Berechtigungen sind für die Verarbeitung von Vitalparametern von entscheidender Bedeutung.

Berechtigungen

Ihre App muss die entsprechenden Health Connect-Berechtigungen anfordern, bevor sie Vitalparameter lesen oder schreiben kann. Häufige Berechtigungen für Vitalparameter sind Blutdruck, Herzfrequenz, Körpertemperatur, Blutzucker, Sauerstoffsättigung und Atemfrequenz. Das bedeutet:

Im Folgenden sehen Sie ein Beispiel dafür, wie Sie Berechtigungen für Blutdruck, Herzfrequenz und Körpertemperatur anfordern:

Nachdem Sie eine Client-Instanz erstellt haben, muss Ihre App Berechtigungen vom Nutzer anfordern. Nutzer müssen Berechtigungen jederzeit erteilen oder verweigern können.

Erstellen Sie dazu eine Reihe von Berechtigungen für die erforderlichen Datentypen. Achten Sie darauf, dass die Berechtigungen im Set zuerst in Ihrem Android-Manifest deklariert werden.

// 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)
)

Mit getGrantedPermissions können Sie prüfen, ob Ihrer App bereits die erforderlichen Berechtigungen erteilt wurden. Wenn nicht, fordern Sie diese Berechtigungen mit createRequestPermissionResultContract an. Daraufhin wird der Health Connect-Berechtigungsbildschirm angezeigt.

// 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)
  }
}

Da Nutzer Berechtigungen jederzeit erteilen oder widerrufen können, muss Ihre App die Berechtigungen jedes Mal prüfen, bevor sie verwendet werden, und Szenarien berücksichtigen, in denen die Berechtigung verloren geht.

Rufen Sie die Funktion checkPermissionsAndRun auf, um Berechtigungen anzufordern:

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

Wenn Sie nur Berechtigungen für einen einzelnen Datentyp wie Blutdruck anfordern müssen, fügen Sie nur diesen Datentyp in Ihr Berechtigungssatz ein:

Der Zugriff auf den Blutdruck wird durch die folgenden Berechtigungen geschützt:

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

Wenn Sie Ihrer App die Möglichkeit geben möchten, den Blutdruck zu erfassen, fordern Sie zuerst Berechtigungen für den Datentyp BloodPressureRecord an.

Hier ist die Berechtigung, die Sie deklarieren müssen, um den Blutdruck schreiben zu können:

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

Wenn Sie den Blutdruck lesen möchten, müssen Sie die folgenden Berechtigungen anfordern:

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

Vitalparameter schreiben

In diesem Abschnitt wird beschrieben, wie Sie Vitalparameter in Health Connect schreiben. Vitalparameter werden in der Regel als einzelne Datensätze geschrieben. Wenn Sie mehrere Datensätze gleichzeitig schreiben, z. B. bei der Synchronisierung von einem Sensor oder Backend, verwenden Sie Batching.

Beispiel für das Schreiben eines 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))
}

Batchschreibvorgänge

Wenn Ihre App mehrere Datenpunkte schreiben muss, z. B. beim Synchronisieren von Daten von einem verbundenen Gerät oder einem Backend-Dienst, sollten Sie Batchschreibvorgänge verwenden, um die Effizienz zu verbessern und den Akkuverbrauch zu senken. Health Connect kann bis zu 1.000 Datensätze in einer einzelnen Schreibanfrage verarbeiten.

Der folgende Code zeigt, wie Sie mehrere Datensätze gleichzeitig schreiben:

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))
}

Vitalparameter lesen

Apps können Vitalparameter lesen, um Messungen anzuzeigen, Trends zu analysieren oder Daten mit einem externen Server zu synchronisieren. Verwenden Sie zum Lesen von Vitalparametern eine ReadRecordsRequest mit dem spezifischen Datensatztyp und filtern Sie nach einem Zeitraum.

Beispiel für das Lesen von BloodPressureRecord-Daten:

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
    }
}

Wenn Sie Vitalparameter mit einem Backend-Server synchronisieren oder den Datenspeicher Ihrer App auf dem neuesten Stand halten möchten, verwenden Sie ChangeLogs. So können Sie eine Liste der seit einem bestimmten Zeitpunkt eingefügten, aktualisierten oder gelöschten Datensätze abrufen. Das ist effizienter, als Änderungen manuell zu verfolgen oder alle Daten wiederholt zu lesen. Weitere Informationen finden Sie unter Daten mit Health Connect synchronisieren.

Best Practices

Folgen Sie diesen Richtlinien, um die Zuverlässigkeit der Daten und die Nutzerfreundlichkeit zu verbessern:

  • Schreibhäufigkeit und Batching: Um den E/A-Overhead zu reduzieren und die Akkulaufzeit zu verlängern, sollten Sie Datenpunkte in einem einzelnen insertRecords Aufruf mit Batches von bis zu 1.000 Datensätzen gruppieren, anstatt jeden Punkt einzeln zu schreiben.
    • Live-Tracking:Bei häufigen Updates von Sensoren (z. B. kontinuierliche Glukosemessgeräte oder Herzfrequenzmessgeräte) sollten Sie Daten in Batches in Intervallen von bis zu 15 Minuten schreiben, um Echtzeit-Updates mit der Akkueffizienz in Einklang zu bringen.
    • Hintergrundsynchronisierung:Verwenden Sie WorkManager für verzögerte Schreibvorgänge, z. B. zum Synchronisieren von Daten von einem Begleitgerät oder einem Backend-Dienst. Ein Intervall von 15 Minuten für Batchschreibvorgänge ist empfehlenswert.
  • Duplikate vermeiden: Client-IDs verwenden : Legen Sie beim Erstellen von Datensätzen eine metadata.clientRecordId fest. Health Connect verwendet diese ID, um eindeutige Datensätze zu identifizieren. Wenn Sie versuchen, einen Datensatz mit einer bereits vorhandenen clientRecordId zu schreiben, ignoriert Health Connect das Duplikat oder aktualisiert den vorhandenen Datensatz, anstatt einen neuen zu erstellen. Das Festlegen einer metadata.clientRecordId ist die effektivste Methode, um Duplikate bei Synchronisierungsversuchen oder Neuinstallationen von Apps zu vermeiden.

    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"
        )
    )
  • Vorhandene Daten prüfen:Bevor Sie Daten synchronisieren, fragen Sie Health Connect nach Datensätzen im Synchronisierungszeitraum, um zu prüfen, ob bereits Daten aus Ihrer App vorhanden sind. So vermeiden Sie Duplikate oder das Überschreiben neuerer Daten.

  • Klare Begründungen für Berechtigungen angeben:Verwenden Sie den Permission.createIntent-Ablauf, um zu erklären, warum Ihre App Zugriff auf Gesundheitsdaten benötigt, z. B. „Um Ihre Blutdrucktrends zu beobachten und Informationen bereitzustellen“.

  • Zeitstempel mit Messungen abstimmen:Prüfen Sie, ob die Zeitstempel der Datensätze genau angeben, wann die Messungen vorgenommen wurden. Bei Intervalldaten wie HeartRateRecord müssen startTime und endTime korrekt sein.

Testen

Um die Richtigkeit der Daten und eine hohe Nutzerfreundlichkeit zu gewährleisten, folgen Sie diesen Teststrategien und lesen Sie die offizielle Dokumentation zu Test-Anwendungsfällen.

Überprüfungstools

  • **Health Connect Toolbox**: Mit dieser Begleit-App können Sie Datensätze manuell prüfen , Testdaten löschen und Änderungen an der Datenbank simulieren. So lässt sich am besten prüfen, ob Ihre Datensätze korrekt gespeichert werden.
  • Unittests mit FakeHealthConnectClient: Mit der Testbibliothek können Sie prüfen, wie Ihre App Grenzfälle wie den Widerruf von Berechtigungen oder API Ausnahmen behandelt, ohne dass ein physisches Gerät erforderlich ist.

Checkliste für Qualität

Typische Architektur

Eine Implementierung von Vitalparametern umfasst in der Regel Folgendes:

Komponente Verwaltet
Controller für Vitalparameter Sensor-/Eingabewerte lesen
Batching-Logik
Repository-Ebene (fasst Health Connect-Vorgänge zusammen): Datensätze für Vitalparameter einfügen
Datensätze für Vitalparameter lesen
UI-Ebene (zeigt Folgendes an): Live-Messungen
Verlaufsdaten
Diagramme und Trends

Fehlerbehebung

Symptom Mögliche Ursache Lösung
Fehlende Datentypen (z. B. Blutdruck) Fehlende Schreibberechtigungen oder falsche Zeitfilter. Prüfen Sie, ob Sie die Berechtigung für den spezifischen Datentyp angefordert haben und ob der Nutzer sie erteilt hat. Prüfen Sie, ob Ihre ReadRecordsRequest einen TimeRangeFilter verwendet, der den Zeitpunkt der Messung abdeckt. Weitere Informationen finden Sie unter Berechtigungen.
Duplikate von Datensätzen werden angezeigt clientRecordId fehlt. Weisen Sie jedem Datensatz in den Metadata eine eindeutige clientRecordId zu. So kann Health Connect Duplikate entfernen, wenn dieselben Daten bei einem Synchronisierungsversuch zweimal geschrieben werden. Weitere Informationen finden Sie unter Best Practices.
Datensätze können nicht geschrieben werden Falsche Einheiten oder Werte außerhalb des gültigen Bereichs. Health Connect validiert Datensatzwerte. Blutdruckwerte müssen beispielsweise in einem physiologisch plausiblen Bereich liegen. Informationen zu gültigen Bereichen und Einheiten finden Sie in der Dokumentation zu Datentypen.

Allgemeine Schritte zur Fehlerbehebung

Berechtigungsstatus prüfen. Rufen Sie immer getPermissionStatus() auf, bevor Sie einen Lese- oder Schreibvorgang versuchen. Nutzer können Berechtigungen jederzeit in den Systemeinstellungen widerrufen.