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
Con Connessione Salute puoi anche 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 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 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 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
}
}
Restrizioni alla lettura
Per impostazione predefinita, l'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 quindi 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 precedenti a 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.
Dati aggregati interessati dalle priorità delle app selezionate dall'utente
Gli utenti finali possono impostare la priorità per le app per il sonno e l'attività che hanno integrato con Connessione Salute. Solo gli utenti finali possono modificare questi elenchi di priorità. Quando esegui una lettura aggregata, l'API Aggregate tiene conto di eventuali dati duplicati e conserva solo i dati dell'app con la priorità più elevata. I dati duplicati potrebbero esistere se l'utente ha più app che scrivono contemporaneamente lo stesso tipo di dati, ad esempio il numero di passi effettuati o la distanza percorsa.
Per informazioni su come gli utenti finali possono dare la priorità alle loro app, consulta Gestire i dati di Connessione Salute.
L'utente può aggiungere o rimuovere app e modificarne le priorità. Un utente potrebbe voler rimuovere un'app che scrive dati duplicati in modo che i totali dei dati nella schermata di Connessione Salute siano identici a quelli dell'app a cui ha assegnato la priorità più alta. I totali dei dati vengono aggiornati in tempo reale.
Anche se l'API Aggregate calcola i dati delle app Attività e Sonno eliminando le duplicazioni in base alle priorità impostate dall'utente, puoi comunque creare la tua logica per calcolare i dati separatamente per ogni app che li scrive.
Solo i tipi di dati Attività e Sonno vengono deduplicati da Connessione Salute e i totali dei dati mostrati sono i valori dopo l'esecuzione della deduplica da parte dell'API Aggregate. Questi totali mostrano l'intera giornata più recente per la quale esistono dati su passi e distanza. Per altri tipi di app, i numeri totali di tutte queste app combinate vengono mostrati nei totali dei dati in Connessione Salute.
Letture in background
Puoi richiedere che l'applicazione venga eseguita in background e legga i dati da Connessione Salute. Se richiedi l'autorizzazione Lettura in background, l'utente può concedere alla tua app l'accesso in lettura dei dati in background.