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.