Odczytywanie danych zbiorczych

Aggregating data in Health Connect includes basic aggregations or aggregating data into buckets. Z poniższych procesów dowiesz się, jak to zrobić.

.

Podstawowa agregacja

Aby zastosować podstawowe agregacje danych, użyj funkcji aggregate w obiekcie HealthConnectClient. Akceptuje on obiekt AggregateRequest, w którego parametrach dodajesz typy danych i zakres czasu. Nazwa podstawowej wartości agregacji zależy od użytych typów danych.

Agregacja łączna

Skumulowane zliczanie oblicza łączną wartość.

Z tego przykładu dowiesz się, jak agregować dane dla danego 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
    }
}

Agregacja statystyczna

Statystyczne agregacje obliczają minimalne, maksymalne lub średnie wartości rekordów z próbkami.

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

Zasobniki

Health Connect umożliwia też agregowanie danych w grupy. Dostępne są 2 rodzaje zbiorników: czas trwaniaokres.

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

Czas działania

W takim przypadku dane zbiorcze są dzielone na zbiory w określonym przedziale czasu, np. minuty lub godziny. Aby agregować dane w zasobnikach, użyj aggregateGroupByDuration. Akceptuje obiekt AggregateGroupByDurationRequest, w którym jako parametry podajesz typy danych, zakres czasowy i wartość Duration.

Poniżej przedstawiamy przykład agregacji kroków w przedziały czasowe trwające minutę:

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

Kropka

W tym przypadku dane zbiorcze są dzielone na przedziały według daty, np. tygodnia lub miesiąca. Aby agregować dane w zasobnikach, użyj aggregateGroupByPeriod. Akceptuje obiekt AggregateGroupByPeriodRequest, w którym jako parametry podajesz typy danych, zakres czasowy i wartość Period.

Poniżej przedstawiamy przykład agregacji kroków do zbiorników miesięcznych:

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

Ograniczenia odczytu

Domyślnie aplikacja może odczytywać dane z okresu do 30 dni, jeśli przyznano jej odpowiednie uprawnienia. Dzięki uprawnieniu PERMISSION_READ_HEALTH_DATA_HISTORY aplikacja może odczytywać dane starsze niż 30 dni.

30-dniowe ograniczenie

Aplikacje mogą odczytywać dane z Health Connect przez okres do 30 dni przed przyznaniem uprawnień.

Jeśli jednak użytkownik usunie Twoją aplikację, historia uprawnień zostanie utracona. Jeśli użytkownik ponownie zainstaluje aplikację i po raz kolejny przyzna jej uprawnienia, aplikacja będzie mogła odczytywać dane z Health Connect do 30 dni przed tą datą.

Przykład 30-dni

Jeśli użytkownik po raz pierwszy przyznał Twojej aplikacji uprawnienia do odczytu 30 marca 2023 r., najstarsze dane, które Twoja aplikacja może odczytać, pochodzą z 28 lutego 2023 r.i później.

Użytkownik usuwa Twoją aplikację 10 maja 2023 r. Użytkownik decyduje się na ponowne zainstalowanie aplikacji 15 maja 2023 r. i przyznaje uprawnienia do odczytu. Najwcześniejszą datą, z której aplikacja może odczytać dane, jest 15 kwietnia 2023 r.

odczytywać dane starsze niż 30 dni;

Jeśli chcesz odczytać dane starsze niż 30 dni, musisz użyć uprawnienia PERMISSION_READ_HEALTH_DATA_HISTORY. Bez tego uprawnienia próba odczytu pojedynczego rekordu starszego niż 30 dni spowoduje błąd. Nie możesz też odczytać żadnych danych starszych niż 30 dni za pomocą żadnego z żądań dotyczących zakresu czasowego.

Dane zbiorcze zależne od priorytetów aplikacji wybranych przez użytkownika

Użytkownicy mogą ustawiać priorytet aplikacji Śpij i Aktywność, które zostały zintegrowane z Health Connect. Te listy priorytetów mogą zmieniać tylko użytkownicy. Gdy wykonujesz operację odczytu zbiorczego, interfejs Aggregate API uwzględnia zduplikowane dane i zachowuje tylko dane z aplikacji o najwyższym priorytecie. Duplikaty danych mogą występować, jeśli użytkownik ma kilka aplikacji zapisujących ten sam rodzaj danych (np. liczbę wykonanych kroków lub przebytą odległość) w tym samym czasie.

Informacje o tym, jak użytkownicy mogą nadawać priorytety aplikacjom, znajdziesz w artykule Zarządzanie danymi 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 aplikacji, której nadano najwyższy priorytet. Łączne dane są aktualizowane w czasie rzeczywistym.

Mimo że interfejs Aggregate API oblicza dane aplikacji Aktywność i Sen, usuwając duplikaty zgodnie z ustawionymi przez użytkownika priorytetami, możesz nadal tworzyć własną logikę, aby obliczać dane osobno dla każdej aplikacji zapisującej te dane.

Health Connect usuwa duplikaty tylko w przypadku typów danych Aktywność i Sen. Wyświetlane sumy danych to wartości po usunięciu duplikatów przez interfejs API Aggregate. Te wartości łączne pokazują ostatni pełny dzień, w którym dostępne są dane o kroku i odległości. W przypadku innych typów aplikacji łączna liczba wszystkich takich aplikacji jest widoczna w sumie danych w Health Connect.

Odczytywanie w tle

Możesz poprosić, aby aplikacja działała w tle i czytała dane z Health Connect. Jeśli żądasz uprawnienia Czytaj w tle, użytkownik może zezwolić aplikacji na odczytywanie 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.

Nagrywaj Typ danych zbiorczych
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
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, , MOLYBDENUM_TOTAL, MONOUNSATURATED_FAT_TOTAL, NIACIN_TOTAL, PANTOTHENIC_ACID_TOTAL, PHOSPHORUS_TOTAL, POLYUNSATURATED_FAT_TOTAL, POTASSIUM_TOTAL, , SELENIUM_TOTAL, , THIAMIN_TOTAL, SATURATED_FAT_TOTAL, THIAMIN_TOTAL, SODIUM_TOTAL, VITAMIN_A_TOTAL, VITAMIN_B6_TOTAL, UNSATURATED_FAT_TOTAL, VITAMIN_A_TOTAL, POTASSIUM_TOTAL, , VITAMIN_B6_TOTAL,, , SODIUM_TOTAL, POTASSIUM_TOTAL, SATURATED_FAT_TOTAL, , SODIUM_TOTAL, SATURATED_FAT_TOTAL, SODIUM_TOTAL, , SODIUM_TOTAL, SATURATED_FAT_TOTAL, SODIUM_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, SATURATED_FAT_TOTAL, �MAGNESIUM_TOTALPROTEIN_TOTALRIBOFLAVIN_TOTALSUGAR_TOTALTOTAL_CARBOHYDRATE_TOTALTOTAL_FAT_TOTALVITAMIN_B12_TOTALVITAMIN_C_TOTALVITAMIN_D_TOTALVITAMIN_E_TOTALVITAMIN_K_TOTALZINC_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