Odczytywanie danych zbiorczych

Agregowanie danych w Health Connect obejmuje podstawowe agregacje lub agregowanie danych w zasobnikach. Poniższe instrukcje pokazują, jak to zrobić.

Agregacja podstawowa

Aby użyć podstawowej agregacji danych, użyj funkcji aggregate na obiekcie HealthConnectClient. Akceptuje obiekt AggregateRequest, w którym jako parametry dodajesz typy danych i zakres czasu. Sposób wywoływania podstawowych agregacji zależy od używanych typów danych.

Agregacja skumulowana

Agregacja skumulowana oblicza wartość całkowitą.

Poniższy przykład pokazuje, jak agregować dane dla typu danych:

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
    }
}

Filtrowanie według pochodzenia danych

Dane zbiorcze możesz też filtrować według ich pochodzenia. Możesz na przykład uwzględnić tylko dane zapisane przez konkretną aplikację.

Ten przykład pokazuje, jak używać symboli dataOriginFilterAggregateRequest do agregowania kroków z określonej aplikacji:

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
    }
}

Agregacja statystyczna

Agregacja statystyczna oblicza wartości minimalne, maksymalne lub średnie rekordów z próbkami.

Poniższy przykład pokazuje, jak używać agregacji statystycznej:

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] ?: 0L
        val maximumHeartRate = response[HeartRateRecord.BPM_MAX] ?: 0L
    } catch (e: Exception) {
        // Run error handling here
    }
}

Zasobniki

Health Connect może też umożliwiać agregowanie danych w przedziałach. Możesz używać 2 rodzajów przedziałów: czasu trwaniaokresu.

Po wywołaniu zwracają listę zasobników. Pamiętaj, że lista może być rzadka, więc jeśli kosz nie zawiera żadnych danych, nie jest uwzględniany na liście.

Czas działania

W tym przypadku dane zbiorcze są dzielone na zasobniki w określonym przedziale czasu, np. w ciągu minuty lub godziny. Aby agregować dane w zasobnikach, użyj aggregateGroupByDuration. Akceptuje obiekt AggregateGroupByDurationRequest, w którym jako parametry dodajesz typy danych, zakres czasu i Duration. Możesz użyć par obiektów Instant lub LocalDateTime dla startTimeendTimeTimeRangeFilter.

Poniżej znajdziesz przykład agregowania kroków w przedziały minutowe:

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] ?: 0L
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

Kropka

W tym przypadku dane zbiorcze są dzielone na przedziały w określonym przedziale czasu, np. w tygodniu lub miesiącu. Aby agregować dane w zasobnikach, użyj aggregateGroupByPeriod. Akceptuje obiekt AggregateGroupByPeriodRequest, w którym jako parametry dodajesz typy danych, zakres czasu i Period.

Poniżej znajdziesz przykład agregowania kroków w miesięcznych przedziałach:

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] ?: 0L
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

Ograniczenia odczytu

Domyślnie wszystkie aplikacje mogą odczytywać dane z Health Connect z okresu do 30 dni przed przyznaniem im uprawnień.

Jeśli musisz rozszerzyć uprawnienia do odczytu poza domyślne ograniczenia, poproś o to, wysyłając PERMISSION_READ_HEALTH_DATA_HISTORY. W przeciwnym razie próba odczytania rekordów starszych niż 30 dni bez tego uprawnienia spowoduje błąd.

Historia uprawnień usuniętej aplikacji

Jeśli użytkownik usunie Twoją aplikację, wszystkie uprawnienia, w tym uprawnienia do historii, zostaną cofnięte. Jeśli użytkownik ponownie zainstaluje aplikację i ponownie przyzna jej uprawnienia, będą obowiązywać te same domyślne ograniczenia, a aplikacja będzie mogła odczytywać dane z Health Connect z okresu do 30 dni przed tą nową datą.

Załóżmy na przykład, że użytkownik usunie Twoją aplikację 10 maja 2023 r., a następnie zainstaluje ją ponownie 15 maja 2023 r. i przyzna jej uprawnienia do odczytu. Najwcześniejsza data, od której Twoja aplikacja może domyślnie odczytywać dane, to 15 kwietnia 2023 r.

Dane zbiorcze, na które mają wpływ priorytety aplikacji wybrane przez użytkownika

Użytkownicy mogą ustawić priorytet dla aplikacji do monitorowania snu i aktywności, które zintegrowali z Health Connect. Tylko użytkownicy mogą zmieniać te listy priorytetów. Podczas odczytu zbiorczego interfejs Aggregate API uwzględnia wszelkie zduplikowane dane i zachowuje tylko dane z aplikacji o najwyższym priorytecie. Zduplikowane dane mogą występować, jeśli użytkownik ma kilka aplikacji, które w tym samym czasie zapisują ten sam rodzaj danych, np. liczbę wykonanych kroków lub pokonany dystans.

Ilustracja przedstawiająca zmianę priorytetów aplikacji
Rysunek 1. Zmiana kolejności priorytetów aplikacji

Ilustracja przedstawiająca zmianę priorytetów aplikacji

Informacje o tym, jak użytkownicy mogą określać priorytety aplikacji, znajdziesz w artykule Zarządzanie danymi w Health Connect.

Użytkownik może dodawać i usuwać aplikacje oraz zmieniać ich priorytety. Użytkownik może chcieć usunąć aplikację, która zapisuje zduplikowane dane, aby sumy danych na ekranie Health Connect były identyczne z danymi w aplikacji, której przyznał najwyższy priorytet. Łączne dane są aktualizowane w czasie rzeczywistym.

Mimo że interfejs Aggregate API oblicza dane aplikacji Aktywność i Sen, usuwając duplikaty danych zgodnie z ustawionymi przez użytkownika priorytetami, możesz utworzyć własną logikę, aby obliczać dane oddzielnie dla każdej aplikacji, która je zapisuje.

Tylko typy danych Aktywność i Sen są usuwane przez Health Connect, a wyświetlane sumy danych to wartości po usunięciu duplikatów przez interfejs Aggregate API. Te wartości łączne pokazują ostatni pełny dzień, w którym dostępne są dane dotyczące kroków i odległości. W przypadku innych typów danych zagregowane wyniki łączą wszystkie dane tego typu w Health Connect ze wszystkich aplikacji, które je zapisały.

Odczytywanie w tle

Możesz poprosić o uruchomienie aplikacji w tle i odczytywanie danych z Health Connect. Jeśli poprosisz o uprawnienie Odczyt w tle, użytkownik może przyznać Twojej aplikacji dostęp do odczytywania danych w tle.

Obsługiwane typy danych zbiorczych według rekordu

Ta tabela zawiera listę wszystkich obsługiwanych typów danych zbiorczych według rekordu Health Connect.

Tabela: obsługiwane typy danych zbiorczych według rekordu
Nagrywaj Typ danych zbiorczych
ActiveCaloriesBurnedRecord ACTIVE_CALORIES_TOTAL
ActivityIntensityRecord DURATION_TOTAL, INTENSITY_MINUTES_TOTAL, MODERATE_DURATION_TOTAL, VIGOROUS_DURATION_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, MANGANESE_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, TRANS_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
SpeedRecord SPEED_AVG, SPEED_MAX, SPEED_MIN
StepsRecord COUNT_TOTAL
StepsCadenceRecord RATE_AVG, RATE_MAX, RATE_MIN
TotalCaloriesBurnedRecord ENERGY_TOTAL
WeightRecord WEIGHT_AVG, WEIGHT_MAX, WEIGHT_MIN
WheelchairPushesRecord COUNT_TOTAL