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.