L'agrégation des données dans Santé Connect inclut des agrégations de base ou l'agrégation de données dans des buckets. Les workflows suivants vous expliquent comment obtenir chaque type d'agrégation.
Agrégation de base
Pour utiliser l'agrégation de base sur vos données, utilisez la fonction aggregate
sur l'objet HealthConnectClient
. Celle-ci accepte un objet AggregateRequest
dans lequel vous ajoutez les types de métriques et la période en tant que paramètres. La manière dont les agrégations de base sont appelées dépend des types de métriques utilisés.
Agrégation cumulative
L'agrégation cumulative calcule la valeur totale.
L'exemple suivant vous montre comment agréger les données correspondant à un type en particulier :
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
}
}
Agrégation statistique
L'agrégation statistique calcule les valeurs minimales, maximales ou moyennes des enregistrements avec des échantillons.
L'exemple suivant montre comment utiliser l'agrégation statistique :
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
}
}
Buckets
Santé Connect vous permet également de regrouper des données dans des buckets. Les deux types de buckets que vous pouvez utiliser sont duration (durée) et period (période).
Une fois appelés, ils renvoient une liste de buckets. Notez que cette liste n'est pas forcément exhaustive. Les buckets qui ne contiennent aucune donnée ne s'y trouvent pas.
Durée
Dans ce cas, les données agrégées sont divisées en buckets d'une durée fixe (une minute ou une heure, par exemple). Pour agréger les données dans des buckets, utilisez aggregateGroupByDuration
. Cette fonction accepte un objet AggregateGroupByDurationRequest
dans lequel vous ajoutez les types de métriques, la période et Duration
en tant que paramètres.
Voici un exemple des étapes d'agrégation dans des buckets d'une minute :
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
}
}
Période
Dans ce cas, les données agrégées sont divisées en buckets sur une période de temps basée sur des dates, par exemple une semaine ou un mois. Pour agréger les données dans des buckets, utilisez aggregateGroupByPeriod
. Cette fonction accepte un objet AggregateGroupByPeriodRequest
dans lequel vous ajoutez les types de métriques, la période et Period
en tant que paramètres.
Voici un exemple d'étapes agrégation dans des buckets mensuels :
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
}
}
Restrictions de lecture
Par défaut, votre application peut lire les données remontant jusqu'à 30 jours avec toutes les autorisations accordées.
Avec l'autorisation PERMISSION_READ_HEALTH_DATA_HISTORY
, votre application peut lire les données datant de plus de 30 jours.
Restriction de 30 jours
Les applications peuvent lire les données de Santé Connect remontant jusqu'à 30 jours avant la date d'octroi de la première autorisation.
Toutefois, si un utilisateur supprime votre application, l'historique des autorisations sera perdu. Si l'utilisateur réinstalle votre application et accorde de nouveau l'autorisation, elle pourra lire les données de Santé Connect remontant jusqu'à 30 jours avant cette nouvelle date.
Exemple sur 30 jours
Si un utilisateur a d'abord accordé une autorisation de lecture à votre application le 30 mars 2023, les premières données que votre application pourra lire remonteront au 28 février 2023.
Ce même utilisateur supprime ensuite votre application le 10 mai 2023. L'utilisateur décide de la réinstaller le 15 mai 2023 et d'accorder une autorisation de lecture. Votre application pourra donc lire les données remontant au 15 avril 2023.
Lire les données de plus de 30 jours
Si vous souhaitez lire des données datant de plus de 30 jours, vous devez utiliser l'autorisation PERMISSION_READ_HEALTH_DATA_HISTORY
. Sans cette autorisation, une tentative de lecture d'un seul enregistrement datant de plus de 30 jours génère une erreur.
Vous ne pouvez pas non plus lire de données datant de plus de 30 jours à l'aide de l'une des requêtes de plage de dates.