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.