Aggregierte Daten lesen

Das Aggregieren von Daten in Health Connect umfasst grundlegende Aggregationen oder das Aggregieren von Daten in Buckets. Die folgenden Workflows zeigen Ihnen, wie Sie beides tun können.

Einfache Aggregation

Verwenden Sie die Funktion aggregate für das HealthConnectClient-Objekt, um eine einfache Aggregation Ihrer Daten zu verwenden. Sie akzeptiert ein AggregateRequest-Objekt, dem Sie die Messwerttypen und den Zeitraum als Parameter hinzufügen. Wie einfache Aggregatfunktionen aufgerufen werden, hängt von den verwendeten Messwerttypen ab.

Kumulative Aggregation

Bei der kumulativen Aggregation wird der Gesamtwert berechnet.

Das folgende Beispiel zeigt, wie Sie Daten für einen Datentyp aggregieren:

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 Datensätzen mit Stichproben berechnet.

Das folgende Beispiel zeigt, wie die statistische Aggregation verwendet wird:

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

Eimer

Mit Health Connect können Sie Daten auch in Buckets aggregieren. Zu den zwei Arten von Buckets, die Sie verwenden können, gehören duration und period.

Nach dem Aufruf wird eine Liste von Buckets zurückgegeben. Die Liste kann dünnbesetzt sein. Buckets, die keine Daten enthalten, werden nicht in die Liste aufgenommen.

Dauer

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

Im Folgenden sehen Sie ein Beispiel für das Aggregieren von Schritten in minutenlangen Buckets:

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 aggregierte Daten innerhalb eines datumsbasierten Zeitraums, z. B. einer Woche oder eines Monats, in Buckets aufgeteilt. Verwenden Sie aggregateGroupByPeriod, um Daten in Buckets zusammenzufassen. Sie akzeptiert ein AggregateGroupByPeriodRequest-Objekt, dem Sie die Messwerttypen, den Zeitraum und Period als Parameter hinzufügen.

Hier sehen Sie ein Beispiel für das Aggregieren von Schritten in monatlichen Buckets:

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

Lesebeschränkung für 30 Tage

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

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

Beispiel

Wenn ein Nutzer Ihrer Anwendung erstmals am 30. März 2023 eine Leseberechtigung erteilt hat, können Daten frühestens ab dem 28. Februar 2023 von Ihrer App zurückgelesen werden.

Am 10. Mai 2023 löscht der Nutzer deine App. Der Nutzer beschließt, sie am 15. Mai 2023 neu zu installieren und eine Leseberechtigung zu erteilen. Das früheste Datum, ab dem Ihre App jetzt Daten lesen kann, ist der 15. April 2023.