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, todas las aplicaciones pueden leer datos de Health Connect hasta 30 días antes del otorgamiento de cualquier permiso.
Si necesitas extender los permisos de lectura más allá de cualquiera de las restricciones predeterminadas, solicita el PERMISSION_READ_HEALTH_DATA_HISTORY
.
De lo contrario, sin este permiso, se producirá un error si intentas leer registros de más de 30 días.
Historial de permisos de una app borrada
Si un usuario borra tu app, se revocarán todos los permisos, incluido el permiso de historial. Si el usuario vuelve a instalar tu app y le otorga permiso de nuevo, se aplican las mismas restricciones predeterminadas, y tu app puede leer datos de Health Connect hasta 30 días antes de esa fecha nueva.
Por ejemplo, supongamos que el usuario borra tu app el 10 de mayo de 2023, la reinstala el 15 de mayo de 2023 y otorga permisos de lectura. Ahora, la fecha más antigua de la que puede leer datos es el 15 de abril de 2023.
Datos agregados afectados por las prioridades de las apps seleccionadas por el usuario
Los usuarios finales pueden establecer la prioridad de las apps de Actividad y Sueño que integraron con Health Connect. Solo los usuarios finales pueden alterar estas listas de prioridad. Cuando realizas una lectura agregada, la API de Aggregate considera los datos duplicados y solo conserva los datos de la app con la prioridad más alta. Es posible que existan datos duplicados si el usuario tiene varias apps que escriben el mismo tipo de datos, como la cantidad de pasos dados o la distancia recorrida, al mismo tiempo.
Para obtener información sobre cómo los usuarios finales pueden priorizar sus apps, consulta Administra los datos de Health Connect.
El usuario puede agregar o quitar apps, así como cambiar sus prioridades. Es posible que un usuario desee quitar una app que escribe datos duplicados para que los totales de datos en la pantalla de Health Connect sean idénticos a la app a la que le asignó la prioridad más alta. Los totales de datos se actualizan en tiempo real.
Aunque la API de Aggregate calcula los datos de las apps de Actividad y de Relojes de actividad a través de la eliminación de duplicados según la forma en que el usuario estableció las prioridades, puedes crear tu propia lógica para calcular los datos por separado para cada app que escriba esos datos.
Health Connect solo anula los duplicados de los tipos de datos de Actividad y Sueño, y los totales de datos que se muestran son los valores después de que la API de Aggregate realiza la anulación de duplicados. Estos totales muestran el día completo más reciente en el que existen datos de pasos y distancia. En el caso de otros tipos de apps, las cantidades totales de todas esas apps combinadas se muestran en los totales de datos de Health Connect.
Lecturas en segundo plano
Puedes solicitar que tu aplicación se ejecute en segundo plano y lea datos de Health Connect. Si solicitas el permiso Leer en segundo plano, el usuario puede otorgarle a tu app acceso para leer datos en segundo plano.
Tipos de datos agregados admitidos por registro
En esta tabla, se enumeran todos los tipos de datos agregados compatibles por registro de Health Connect.