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 zusammengefasste 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 die zusammengefassten Daten in Zeitblöcke aufgeteilt, 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.