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 zagregowanej zależy od używanych typów danych.

Agregacja łączna

Skumulowane zliczanie oblicza łączną wartość.

Z poniższego 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
    }
}

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 za pomocą funkcji dataOriginFilterAggregateRequest zsumować kroki z konkretnej 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

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 grupach. 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 zasośnikach, użyj aggregateGroupByDuration. Akceptuje obiekt AggregateGroupByDurationRequest, w którym jako parametry dodajesz 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 zasośnikach, użyj aggregateGroupByPeriod. Akceptuje obiekt AggregateGroupByPeriodRequest, w którym jako parametry dodajesz typy danych, zakres czasowy i wartość Period.

Poniżej przedstawiamy przykład agregacji kroków w grupy miesięczne:

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 wszystkie aplikacje mogą odczytywać dane z Health Connect przez okres do 30 dni przed przyznaniem uprawnień.

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

Historia uprawnień usuniętych aplikacji

Jeśli użytkownik usunie Twoją aplikację, wszystkie uprawnienia, w tym uprawnienie do historii, zostaną cofnięte. Jeśli użytkownik ponownie zainstaluje aplikację i po raz kolejny udzieli jej uprawnień, będą miały zastosowanie te same domyślne ograniczenia, a aplikacja będzie mogła odczytywać dane z Health Connect przez maksymalnie 30 dni przed tą nową datą.

Załóżmy na przykład, że użytkownik usuwa Twoją aplikację 10 maja 2023 r., a potem ponownie ją instaluje 15 maja 2023 r. i przyznaje uprawnienia do odczytu. Najwcześniejsza data, z której aplikacja może teraz domyślnie odczytywać dane, to 15 kwietnia 2023 r.

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óra ma 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 łączne wartości pokazują ostatni pełny dzień, w którym dostępne są dane dotyczące liczby kroków 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
ActiveCaloriesBurned ACTIVE_CALORIES_TOTAL
BasalMetabolicRate BASAL_CALORIES_TOTAL
BloodPressure DIASTOLIC_AVG, DIASTOLIC_MAX, DIASTOLIC_MIN, SYSTOLIC_AVG, SYSTOLIC_MAX, SYSTOLIC_MIN
CyclingPedalingCadence RPM_AVG, RPM_MAX, RPM_MIN
Distance DISTANCE_TOTAL
ElevationGained ELEVATION_GAINED_TOTAL
ExerciseSession EXERCISE_DURATION_TOTAL
FloorsClimbed FLOORS_CLIMBED_TOTAL
HeartRate BPM_AVG, BPM_MAX, BPM_MIN, MEASUREMENTS_COUNT
Height HEIGHT_AVG, HEIGHT_MAX, HEIGHT_MIN
Hydration VOLUME_TOTAL
MindfulnessSession MINDFULNESS_DURATION_TOTAL
Nutrition 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, 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_TOTALTOTAL_FAT_TOTAL
Power POWER_AVG, POWER_MAX, POWER_MIN
RestingHeartRate BPM_AVG, BPM_MAX, BPM_MIN
SkinTemperature TEMPERATURE_DELTA_AVG, TEMPERATURE_DELTA_MAX, TEMPERATURE_DELTA_MIN
SleepSession SLEEP_DURATION_TOTAL
Speed SPEED_AVG, SPEED_MAX, SPEED_MIN
Steps COUNT_TOTAL
StepsCadence RATE_AVG, RATE_MAX, RATE_MIN
TotalCaloriesBurned ENERGY_TOTAL
Weight WEIGHT_AVG, WEIGHT_MAX, WEIGHT_MIN
WheelchairPushes COUNT_TOTAL