Odczytywanie danych zbiorczych

Agregowanie danych w Health Connect obejmuje podstawowe agregacje lub agregowanie danych w zasobnikach. Poniższe procesy 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ędniać tylko dane zapisane przez konkretną aplikację.

Ten przykład pokazuje, jak używać 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]
        val maximumHeartRate = response[HeartRateRecord.BPM_MAX]
    } 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 zagregowane dane 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.

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]
        }
    } 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]
        }
    } 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 pierwszych uprawnień.

Jeśli chcesz rozszerzyć uprawnienia do odczytu poza domyślne ograniczenia, poproś o 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 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 przebyty dystans.

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 aplikacji w sumach danych w Health Connect wyświetlane są łączne liczby wszystkich takich aplikacji.

Odczytywanie w tle

Możesz poprosić, aby Twoja aplikacja działała w tle i odczytywała dane 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.

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