Cómo leer datos agregados

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

Restricción de lectura 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

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.