Lire les données agrégées

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, 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à de l'une des restrictions par défaut, demandez PERMISSION_READ_HEALTH_DATA_HISTORY. Sinon, sans cette autorisation, une tentative de lecture d'enregistrements datant de plus de 30 jours génère une erreur.

Historique des autorisations d'une application supprimée

Si un utilisateur supprime votre application, toutes les autorisations, y compris l'autorisation d'accéder à l'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. Votre application pourra donc lire les données remontant au 15 avril 2023.

Données agrégées affectées par les priorités d'application sélectionnées par l'utilisateur

Les utilisateurs finaux peuvent définir la priorité des applications de sommeil et d'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 de toutes les 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 plusieurs applications écrivent 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 hiérarchiser leurs applications, consultez la section Gérer les données Santé Connect.

L'utilisateur peut ajouter ou supprimer des applications, ainsi que 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 attribué la priorité la plus élevée. Les totaux des données sont mis à jour en temps réel.

Même si l'API Aggregate calcule les données des applications Activity et Sleep en les dédupliquant en fonction de la façon dont l'utilisateur a défini ses priorités, vous pouvez toujours créer votre propre logique pour calculer les données séparément pour chaque application qui les écrit.

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 suppression des doublons effectuée par l'API Aggregate. Ces totaux indiquent le jour complet le plus récent pour lequel des données sont disponibles pour les pas et la distance. 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 autoriser votre application à lire les données en arrière-plan.

Types de données agrégées compatibles par enregistrement

Ce tableau liste tous les types de données agrégées compatibles par enregistrement Santé Connect.

Enregistrer Type de données agrégées
ActiveCaloriesBurnedRecord ACTIVE_CALORIES_TOTAL
BasalMetabolicRateRecord BASAL_CALORIES_TOTAL
BloodPressureRecord DIASTOLIC_AVG, DIASTOLIC_MAX, DIASTOLIC_MIN, SYSTOLIC_AVG, SYSTOLIC_MAX, SYSTOLIC_MIN
CyclingPedalingCadenceRecord RPM_AVG, RPM_MAX, RPM_MIN
DistanceRecord DISTANCE_TOTAL
ElevationGainedRecord ELEVATION_GAINED_TOTAL
ExerciseSessionRecord EXERCISE_DURATION_TOTAL
FloorsClimbedRecord FLOORS_CLIMBED_TOTAL
HeartRateRecord BPM_AVG, BPM_MAX, BPM_MIN, MEASUREMENTS_COUNT
HeightRecord HEIGHT_AVG, HEIGHT_MAX, HEIGHT_MIN
HydrationRecord VOLUME_TOTAL
MindfulnessSessionRecord MINDFULNESS_DURATION_TOTAL
NutritionRecord BIOTIN_TOTAL, CAFFEINE_TOTAL, CALCIUM_TOTAL, CHLORIDE_TOTAL, CHOLESTEROL_TOTAL, CHROMIUM_TOTAL, COPPER_TOTAL, DIETARY_FIBER_TOTAL, ENERGY_FROM_FAT_TOTAL, ENERGY_TOTAL, FOLATE_TOTAL, FOLIC_ACID_TOTAL, IODINE_TOTAL, IRON_TOTAL, MAGNESIUM_TOTAL, MOLYBDENUM_TOTAL, MONOUNSATURATED_FAT_TOTAL, NIACIN_TOTAL, PANTOTHENIC_ACID_TOTAL, PHOSPHORUS_TOTAL, POLYUNSATURATED_FAT_TOTAL, POTASSIUM_TOTAL, PROTEIN_TOTAL, RIBOFLAVIN_TOTAL, SATURATED_FAT_TOTAL, SELENIUM_TOTAL, SODIUM_TOTAL, SUGAR_TOTAL, THIAMIN_TOTAL, TOTAL_CARBOHYDRATE_TOTAL, TOTAL_FAT_TOTAL, UNSATURATED_FAT_TOTAL, VITAMIN_A_TOTAL, VITAMIN_B12_TOTAL, VITAMIN_B6_TOTAL, VITAMIN_C_TOTAL, VITAMIN_D_TOTAL, VITAMIN_E_TOTAL, VITAMIN_K_TOTAL, ZINC_TOTAL
PowerRecord POWER_AVG, POWER_MAX, POWER_MIN
RestingHeartRateRecord BPM_AVG, BPM_MAX, BPM_MIN
SkinTemperatureRecord TEMPERATURE_DELTA_AVG, TEMPERATURE_DELTA_MAX, TEMPERATURE_DELTA_MIN
SleepSessionRecord SLEEP_DURATION_TOTAL
TotalCaloriesBurnedRecord ENERGY_TOTAL
WeightRecord WEIGHT_AVG, WEIGHT_MAX, WEIGHT_MIN
WheelchairPushesRecord COUNT_TOTAL