Leggere dati aggregati

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

Aggregazione di base

Per utilizzare l'aggregazione di base sui dati, usa la funzione aggregate sull'oggetto HealthConnectClient. Accetta Oggetto AggregateRequest in cui aggiungi i tipi di metriche e l'intervallo di tempo come parametri. La modalità di chiamata degli aggregati di base dipende i 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 di con i 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 i bucket che puoi utilizzare includono duration e period.

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

Durata

In questo caso, i dati aggregati vengono suddivisi in bucket di una lunghezza fissa ad esempio un minuto o un'ora. Per aggregare i dati in bucket, utilizza aggregateGroupByDuration Accetta AggregateGroupByDurationRequest in cui aggiungi l'oggetto 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
    }
}

Period

In questo caso, i dati aggregati vengono suddivisi in bucket all'interno di un importo basato sulla data ad esempio una settimana o un mese. Per aggregare i dati in bucket, utilizza aggregateGroupByPeriod Accetta AggregateGroupByPeriodRequest in cui aggiungi l'oggetto 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 di quando che qualsiasi autorizzazione sia stata concessa.

Tuttavia, se un utente elimina la tua app, la cronologia delle autorizzazioni viene persa. Se l'utente reinstalla la tua app e concede di nuovo l'autorizzazione, l'app può leggere i dati da 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 risale al 28 febbraio 2023 in poi.

L'utente elimina 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 in cui la tua app può ora di lettura dei dati è il 15 aprile 2023.