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 zusammengefasste 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 können alle Anwendungen Daten aus Health Connect bis zu 30 Tage vor der Ersterteilung einer Berechtigung lesen.
Wenn Sie die Leseberechtigungen über die Standardeinschränkungen hinaus erweitern möchten, beantragen Sie die PERMISSION_READ_HEALTH_DATA_HISTORY
.
Andernfalls führt ein Versuch, Einträge zu lesen, die älter als 30 Tage sind, ohne diese Berechtigung zu einem Fehler.
Berechtigungsverlauf für eine gelöschte App
Wenn ein Nutzer Ihre App löscht, werden alle Berechtigungen, einschließlich der Berechtigung für den Verlauf, widerrufen. Wenn der Nutzer Ihre App neu installiert und die Berechtigung noch einmal erteilt, gelten dieselben Standardeinschränkungen und Ihre App kann bis zu 30 Tage vor diesem neuen Datum Daten von Health Connect lesen.
Angenommen, der Nutzer löscht Ihre App am 10. Mai 2023, installiert sie am 15. Mai 2023 neu und gewährt Leseberechtigungen. Das früheste Datum, ab dem Ihre App jetzt standardmäßig Daten lesen kann, ist der 15. April 2023.
Daten aggregieren, die von den vom Nutzer ausgewählten App-Prioritäten betroffen sind
Endnutzer können eine 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.
Unterstützte zusammengefasste Datentypen nach Datensatz
In dieser Tabelle sind alle unterstützten aggregierten Datentypen nach Health Connect-Eintrag aufgeführt.