Leggere dati aggregati

L'aggregazione dei dati in Connessione Salute include le aggregazioni di base o l'aggregazione dei dati in bucket. I flussi di lavoro seguenti mostrano come eseguire entrambe le operazioni.

Aggregazione di base

Per utilizzare l'aggregazione di base sui tuoi dati, utilizza la funzione aggregate sull'oggetto HealthConnectClient. Accetta un oggetto AggregateRequest in cui aggiungi i tipi di metrica e l'intervallo di tempo come parametri. Il modo in cui vengono chiamati i dati aggregati di base dipende dai tipi di metriche utilizzati.

Aggregazione cumulativa

L'aggregazione cumulativa calcola il valore totale.

L'esempio seguente mostra come aggregare i dati per un tipo di dati:

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

Aggregazione statistica

L'aggregazione statistica calcola i valori minimo, massimo o medio dei record con campioni.

L'esempio seguente mostra come utilizzare l'aggregazione statistica:

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

Bucket

Connessione Salute può anche consentirti di aggregare i dati in bucket. I due tipi di bucket che puoi utilizzare includono duration e period.

Una volta chiamati, restituiscono un elenco di bucket. Tieni presente che l'elenco può essere sparso, pertanto un bucket non verrà incluso nell'elenco se non contiene dati.

Durata

In questo caso, i dati aggregati vengono suddivisi in bucket entro un periodo di tempo fisso, ad esempio un minuto o un'ora. Per aggregare i dati in bucket, utilizza aggregateGroupByDuration. Accetta un oggetto AggregateGroupByDurationRequest in cui aggiungi i tipi di metriche, l'intervallo di tempo e Duration come parametri.

Di seguito è riportato un esempio di aggregazione dei passaggi in bucket di 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
    }
}

Punto

In questo caso, i dati aggregati vengono suddivisi in bucket entro un periodo di tempo basato sulle date, ad esempio una settimana o un mese. Per aggregare i dati in bucket, utilizza aggregateGroupByPeriod. Accetta un oggetto AggregateGroupByPeriodRequest in cui aggiungi i tipi di metriche, l'intervallo di tempo e Period come parametri.

Di seguito è riportato un esempio di aggregazione dei passaggi in bucket mensili:

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

Limitazione di lettura per 30 giorni

Le applicazioni possono leggere i dati di Connessione Salute fino a 30 giorni prima della prima concessione dell'autorizzazione.

Tuttavia, se un utente elimina la tua app, la cronologia delle autorizzazioni andrà persa. Se l'utente reinstalla la tua app e concede di nuovo l'autorizzazione, l'app può leggere i dati di Connessione Salute fino a 30 giorni prima della nuova data.

Esempio

Se un utente ha concesso l'autorizzazione di lettura per la prima volta alla tua applicazione il 30 marzo 2023, i primi dati che l'app potrebbe leggere a partire dal 28 febbraio 2023

Successivamente, l'utente eliminerà la tua app il 10 maggio 2023. L'utente decide di reinstallarlo il 15 maggio 2023 e concedere l'autorizzazione di lettura. La prima data a partire dal quale l'app può ora leggere i dati è il 15 aprile 2023.