L'aggregazione dei dati in Connessione Salute include aggregazioni di base o aggregazione di dati in bucket. I seguenti flussi di lavoro mostrano come eseguire entrambe le operazioni.
Aggregazione di base
Per utilizzare l'aggregazione di base sui dati, utilizza la funzione aggregate
nell'oggetto HealthConnectClient
. Accetta un oggetto
AggregateRequest
in cui aggiungi i tipi di metriche
e l'intervallo di tempo come parametri. Il modo in cui vengono chiamati gli 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 minimi, massimi o medi dei record 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 ti consente anche di aggregare i dati in bucket. I due tipi di bucket che puoi utilizzare sono duration e period.
Una volta chiamate, 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 in un intervallo 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 metrica, 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 in un periodo di tempo basato su 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 metrica, 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
}
}
Restrizioni alla lettura
Per impostazione predefinita, la tua app può leggere i dati fino a 30 giorni con qualsiasi autorizzazione concessa.
Con l'autorizzazione PERMISSION_READ_HEALTH_DATA_HISTORY
, la tua app può leggere i dati precedenti a 30 giorni.
Limitazione di 30 giorni
Le applicazioni possono leggere i dati di Connessione Salute fino a 30 giorni prima della prima concessione di qualsiasi autorizzazione.
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, la tua app può leggere i dati di Connessione Salute fino a 30 giorni prima della nuova data.
Esempio di 30 giorni
Se un utente ha concesso per la prima volta l'autorizzazione di lettura alla tua applicazione il 30 marzo 2023, i dati più antichi che la tua app potrebbe leggere risalgono al 28 febbraio 2023.
L'utente elimina la tua app il 10 maggio 2023. L'utente decide di reinstallarlo il 15 maggio 2023 e concede l'autorizzazione di lettura. La data più recente a partire dalla quale la tua app può leggere i dati è il 15 aprile 2023.
Leggere i dati più vecchi di 30 giorni
Se vuoi leggere dati precedenti a 30 giorni, devi utilizzare l'autorizzazione PERMISSION_READ_HEALTH_DATA_HISTORY
. Senza questa autorizzazione, un tentativo di lettura di un singolo record precedente a 30 giorni genera un errore.
Inoltre, non puoi leggere i dati precedenti a 30 giorni utilizzando una delle richieste di intervallo di tempo.