En Health Connect, se pueden hacer agregaciones básicas o agregar datos en buckets. En los siguientes flujos de trabajo, se muestra cómo realizar ambas tareas.
Agregación básica
Para usar la agregación básica en tus datos, utiliza la función aggregate
en tu objeto HealthConnectClient
. Acepta un objeto AggregateRequest
en el que agregas los tipos de métricas y el intervalo de tiempo como sus parámetros. La forma en que se llaman las agregaciones básicas depende de los tipos de métricas usados.
Agregación acumulativa
La agregación acumulativa calcula el valor total.
En el siguiente ejemplo, se muestra cómo agregar datos a un tipo de datos:
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
}
}
Agregación estadística
La agregación estadística calcula los valores mínimos, máximos o promedio de los registros con muestras.
En el siguiente ejemplo, se muestra cómo usar la agregación estadística:
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
}
}
Buckets
Health Connect también te permite agregar datos a buckets. Los dos tipos de buckets que puedes usar incluyen duración y período.
Una vez que se los llama, muestran una lista de buckets. Ten en cuenta que la lista puede ser dispersa, por lo que no se incluye un bucket en ella si no contiene datos.
Duración
En este caso, los datos agregados se dividen en buckets dentro de un período fijo, como un minuto o una hora. Para agregar datos en buckets, usa aggregateGroupByDuration
. Acepta un objeto AggregateGroupByDurationRequest
en el que agregas los tipos de métricas, el intervalo de tiempo y la Duration
como parámetros.
A continuación, se muestra un ejemplo de cómo agregar pasos en buckets de un minuto:
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
}
}
Período
En este caso, los datos agregados se dividen en buckets dentro de un intervalo de tiempo basado en la fecha, como una semana o un mes. Para agregar datos en buckets, usa aggregateGroupByPeriod
. Acepta un objeto AggregateGroupByPeriodRequest
en el que agregas los tipos de métricas, el intervalo de tiempo y la Period
como parámetros.
A continuación, se muestra un ejemplo de cómo agregar pasos en buckets mensuales:
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
}
}
Restricciones de lectura
De forma predeterminada, tu app puede leer datos hasta por 30 días con cualquier permiso otorgado.
Con el permiso PERMISSION_READ_HEALTH_DATA_HISTORY
, tu app puede leer datos de más de 30 días.
Restricción de 30 días
Las aplicaciones pueden leer datos de Health Connect hasta 30 días antes del otorgamiento de cualquier permiso.
Sin embargo, si un usuario borra tu app, se perderá el historial de permisos. Si el usuario vuelve a instalar tu app y le otorga permiso de nuevo, la app podrá leer datos de Health Connect hasta 30 días antes de esa fecha nueva.
Ejemplo de 30 días
Si un usuario otorgó permiso de lectura a tu aplicación por primera vez el 30 de marzo de 2023, los datos más antiguos que podría leer tu app serán del 28 de febrero de 2023 en adelante.
Luego, el 10 de mayo de 2023, el usuario borra tu app. El usuario decide volver a instalarla el 15 de mayo de 2023 y otorgar permiso de lectura. Ahora, la fecha más antigua de la que puede leer datos es el 15 de abril de 2023.
Lee datos de más de 30 días
Si deseas leer datos de más de 30 días, debes usar el permiso PERMISSION_READ_HEALTH_DATA_HISTORY
. Sin este permiso, intentar leer un solo registro de más de 30 días genera un error.
Tampoco puedes leer datos de más de 30 días con una de las solicitudes de período.