Aggregierte Daten lesen

Die Aggregation von Daten in Health Connect umfasst grundlegende Aggregationen oder die Aggregation von Daten in Buckets. In den folgenden Workflows wird gezeigt, wie Sie beides tun.

Einfache Aggregation

Wenn Sie Ihre Daten einfach zusammenfassen möchten, verwenden Sie die Funktion aggregate für das HealthConnectClient-Objekt. Es wird ein AggregateRequest-Objekt akzeptiert, dem Sie die Messwerttypen und den Zeitraum als Parameter hinzufügen. Wie grundlegende Aggregate aufgerufen werden, hängt von den verwendeten Messwerttypen ab.

Kumulative Aggregation

Bei der kumulativen Aggregation wird der Gesamtwert berechnet.

Im folgenden Beispiel wird gezeigt, wie Daten für einen Datentyp zusammengefasst werden:

suspend fun aggregateDistance(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response = healthConnectClient.aggregate(
            AggregateRequest(
                metrics = setOf(DistanceRecord.DISTANCE_TOTAL),
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
        // The result may be null if no data is available in the time range
        val distanceTotalInMeters = response[DistanceRecord.DISTANCE_TOTAL]?.inMeters ?: 0L
    } catch (e: Exception) {
        // Run error handling here
    }
}

Statistische Aggregation

Bei der statistischen Aggregation werden die Mindest-, Höchst- oder Durchschnittswerte von Einträgen mit Stichproben berechnet.

Das folgende Beispiel zeigt die Verwendung der statistischen Aggregation:

suspend fun aggregateHeartRate(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response =
            healthConnectClient.aggregate(
                AggregateRequest(
                    setOf(HeartRateRecord.BPM_MAX, HeartRateRecord.BPM_MIN),
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
                )
            )
        // The result may be null if no data is available in the time range
        val minimumHeartRate = response[HeartRateRecord.BPM_MIN]
        val maximumHeartRate = response[HeartRateRecord.BPM_MAX]
    } catch (e: Exception) {
        // Run error handling here
    }
}

Bucket

Mit Health Connect können Sie Daten auch in Buckets zusammenfassen. Sie können die beiden Bucket-Typen duration (Dauer) und period (Zeitraum) verwenden.

Nach dem Aufruf geben sie eine Liste von Buckets zurück. Die Liste kann spärlich sein. Ein Bucket wird nicht in die Liste aufgenommen, wenn er keine Daten enthält.

Dauer

In diesem Fall werden aggregierte Daten in Buckets innerhalb einer festen Zeitspanne unterteilt, z. B. einer Minute oder einer Stunde. Verwenden Sie aggregateGroupByDuration, um Daten in Buckets zusammenzufassen. Es wird ein AggregateGroupByDurationRequest-Objekt akzeptiert, in dem Sie die Messwerttypen, den Zeitraum und Duration als Parameter hinzufügen.

Im folgenden Beispiel werden Schritte in Buckets mit einer Länge von einer Minute zusammengefasst:

suspend fun aggregateStepsIntoMinutes(
    healthConnectClient: HealthConnectClient,
    startTime: LocalDateTime,
    endTime: LocalDateTime
) {
    try {
        val response =
            healthConnectClient.aggregateGroupByDuration(
                AggregateGroupByDurationRequest(
                    metrics = setOf(StepsRecord.COUNT_TOTAL),
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
                    timeRangeSlicer = Duration.ofMinutes(1L)
                )
            )
        for (durationResult in response) {
            // The result may be null if no data is available in the time range
            val totalSteps = durationResult.result[StepsRecord.COUNT_TOTAL]
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

Punkt

In diesem Fall werden zusammengefasste Daten in Zeitblöcke unterteilt, z. B. nach Woche oder Monat. Verwenden Sie aggregateGroupByPeriod, um Daten in Buckets zusammenzufassen. Es wird ein AggregateGroupByPeriodRequest-Objekt akzeptiert, in dem Sie die Messwerttypen, den Zeitraum und Period als Parameter hinzufügen.

Im folgenden Beispiel werden Schritte in monatliche Buckets zusammengefasst:

suspend fun aggregateStepsIntoMonths(
    healthConnectClient: HealthConnectClient,
    startTime: LocalDateTime,
    endTime: LocalDateTime
) {
    try {
        val response =
            healthConnectClient.aggregateGroupByPeriod(
                AggregateGroupByPeriodRequest(
                    metrics = setOf(StepsRecord.COUNT_TOTAL),
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
                    timeRangeSlicer = Period.ofMonths(1)
                )
            )
        for (monthlyResult in response) {
            // The result may be null if no data is available in the time range
            val totalSteps = monthlyResult.result[StepsRecord.COUNT_TOTAL]
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

Leseeinschränkungen

Standardmäßig kann Ihre App mit allen erteilten Berechtigungen Daten bis zu 30 Tage lang lesen. Mit der Berechtigung PERMISSION_READ_HEALTH_DATA_HISTORY kann Ihre App Daten lesen, die älter als 30 Tage sind.

30-tägige Einschränkung

Apps können Daten aus Health Connect bis zu 30 Tage vor der ersten Erteilung einer Berechtigung lesen.

Wenn ein Nutzer Ihre App jedoch löscht, geht der Berechtigungsverlauf verloren. Wenn der Nutzer Ihre App neu installiert und die Berechtigung noch einmal erteilt, kann Ihre App bis zu 30 Tage vor diesem neuen Datum Daten aus Health Connect lesen.

Beispiel für 30 Tage

Wenn ein Nutzer Ihrer App am 30. März 2023 die Leseberechtigung erteilt hat, können die frühesten Daten, die Ihre App abrufen kann, ab dem 28. Februar 2023 stammen.

Der Nutzer löscht Ihre App dann am 10. Mai 2023. Der Nutzer entscheidet sich, die App am 15. Mai 2023 neu zu installieren und die Leseberechtigung zu gewähren. Das früheste Datum, ab dem Ihre App Daten lesen kann, ist der 15. April 2023.

Daten lesen, die älter als 30 Tage sind

Wenn Sie Daten lesen möchten, die älter als 30 Tage sind, müssen Sie die Berechtigung PERMISSION_READ_HEALTH_DATA_HISTORY verwenden. Ohne diese Berechtigung schlägt der Versuch, einen einzelnen Datensatz zu lesen, der älter als 30 Tage ist, fehl. Außerdem können Sie mithilfe von Anfragen für Zeiträume keine Daten lesen, die älter als 30 Tage sind.

Daten aggregieren, die von den vom Nutzer ausgewählten App-Prioritäten betroffen sind

Endnutzer können die Priorität für die Schlaf- und Aktivitäts-Apps festlegen, die sie in Health Connect eingebunden haben. Nur Endnutzer können diese Prioritätslisten ändern. Wenn Sie eine zusammengefasste Lesevorgang ausführen, berücksichtigt die Aggregate API alle doppelten Daten und behält nur die Daten der App mit der höchsten Priorität bei. Duplikate können auftreten, wenn der Nutzer mehrere Apps verwendet, die gleichzeitig dieselbe Art von Daten aufzeichnen, z. B. die Anzahl der Schritte oder die zurückgelegte Strecke.

Informationen dazu, wie Endnutzer ihre Apps priorisieren können, finden Sie unter Health Connect-Daten verwalten.

Der Nutzer kann Apps hinzufügen oder entfernen sowie ihre Prioritäten ändern. Ein Nutzer kann eine App entfernen, die doppelte Daten schreibt, damit die Datensummen auf dem Health Connect-Bildschirm mit der App übereinstimmen, der er die höchste Priorität gegeben hat. Die Datensummen werden in Echtzeit aktualisiert.

Auch wenn die Aggregate API die Daten von Aktivitäts- und Schlaf-Apps berechnet, indem Daten gemäß den vom Nutzer festgelegten Prioritäten dedupliziert werden, können Sie Ihre eigene Logik erstellen, um die Daten für jede App, die diese Daten schreibt, separat zu berechnen.

Nur die Datentypen „Aktivität“ und „Schlaf“ werden von Health Connect dedupliziert. Die angezeigten Datensummen sind die Werte nach der Deduplizierung durch die Aggregate API. Diese Gesamtwerte beziehen sich auf den letzten vollständigen Tag, für den Daten zu Schritten und zurückgelegter Strecke vorhanden sind. Bei anderen Arten von Apps werden die Gesamtzahlen aller dieser Apps in den Datensummen in Health Connect angezeigt.

Lesevorgänge im Hintergrund

Sie können anfordern, dass Ihre Anwendung im Hintergrund ausgeführt wird und Daten aus Health Connect liest. Wenn Sie die Berechtigung Lesen im Hintergrund anfordern, kann der Nutzer Ihrer App Zugriff gewähren, um Daten im Hintergrund zu lesen.