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ć dataOriginFilter
i AggregateRequest
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 trwania i okresu.
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.