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

Restricciones de lectura

De forma predeterminada, tu app puede leer datos de hasta 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, se produce un error cuando se intenta leer un solo registro de más de 30 días. Tampoco puedes leer datos de más de 30 días con una de las solicitudes de período.

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 escribe 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 de Lectura en segundo plano, el usuario puede otorgarle a tu app acceso para leer datos en segundo plano.