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
}
}
Filtrer par origine des données
Vous pouvez également filtrer les données agrégées par origine. Par exemple, en n'incluant que les données écrites par une application spécifique.
L'exemple suivant montre comment utiliser dataOriginFilter
et AggregateRequest
pour agréger les pas d'une application spécifique :
suspend fun aggregateStepsFromSpecificApp(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant,
appPackageName: String
) {
try {
val response = healthConnectClient.aggregate(
AggregateRequest(
metrics = setOf(StepsRecord.COUNT_TOTAL),
timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
dataOriginFilter = setOf(DataOrigin(appPackageName))
)
)
// The result may be null if no data is available in the time range
val totalSteps = response[StepsRecord.COUNT_TOTAL] ?: 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, toutes les applications peuvent lire les données de Santé Connect remontant jusqu'à 30 jours avant la date d'octroi de la première autorisation.
Si vous devez étendre les autorisations de lecture au-delà des restrictions par défaut, demandez le PERMISSION_READ_HEALTH_DATA_HISTORY
.
Sinon, sans cette autorisation, toute tentative de lecture d'enregistrements datant de plus de 30 jours génère une erreur.
Historique des autorisations pour une application supprimée
Si un utilisateur supprime votre application, toutes les autorisations, y compris l'autorisation d'historique, sont révoquées. Si l'utilisateur réinstalle votre application et accorde de nouveau l'autorisation, les mêmes restrictions par défaut s'appliquent, et votre application peut lire les données de Santé Connect remontant jusqu'à 30 jours avant cette nouvelle date.
Par exemple, supposons que l'utilisateur supprime votre application le 10 mai 2023, puis la réinstalle le 15 mai 2023 et accorde des autorisations de lecture. Par défaut, votre application pourra lire les données remontant au 15 avril 2023.
Données agrégées affectées par les priorités des applications sélectionnées par l'utilisateur
Les utilisateurs finaux peuvent définir une priorité pour les applications Sommeil et Activité qu'ils ont intégrées à Santé Connect. Seuls les utilisateurs finaux peuvent modifier ces listes de priorité. Lorsque vous effectuez une lecture agrégée, l'API Aggregate tient compte des éventuelles données en double et ne conserve que les données de l'application ayant la priorité la plus élevée. Des données en double peuvent exister si l'utilisateur dispose de plusieurs applications qui enregistrent le même type de données (par exemple, le nombre de pas effectués ou la distance parcourue) en même temps.
Pour savoir comment les utilisateurs finaux peuvent définir la priorité de leurs applications, consultez Gérer les données Santé Connect.
L'utilisateur peut ajouter ou supprimer des applications, et modifier leurs priorités. Un utilisateur peut souhaiter supprimer une application qui écrit des données en double afin que les totaux de données sur l'écran Santé Connect soient identiques à ceux de l'application à laquelle il a accordé la priorité la plus élevée. Les totaux de données sont mis à jour en temps réel.
Même si l'API Aggregate calcule les données des applications Activité et Sommeil en dédupliquant les données en fonction de la façon dont l'utilisateur a défini les priorités, vous pouvez toujours créer votre propre logique pour calculer les données séparément pour chaque application qui écrit ces données.
Seuls les types de données "Activité" et "Sommeil" sont dédupliqués par Santé Connect. Les totaux de données affichés correspondent aux valeurs après la déduplication effectuée par l'API Aggregate. Ces totaux indiquent le dernier jour complet pour lequel des données sur les pas et la distance sont disponibles. Pour les autres types d'applications, le nombre total de toutes ces applications combinées est indiqué dans les totaux de données de Santé Connect.
Lectures en arrière-plan
Vous pouvez demander à ce que votre application s'exécute en arrière-plan et lise les données de Santé Connect. Si vous demandez l'autorisation Lecture en arrière-plan, votre utilisateur peut accorder à votre application l'accès en lecture aux données en arrière-plan.
Types de données agrégées acceptés par enregistrement
Ce tableau liste tous les types de données agrégées compatibles avec les enregistrements Santé Connect.