Агрегирование данных в Health Connect включает базовые агрегации или агрегацию данных в сегменты. Следующие рабочие процессы показывают, как сделать и то, и другое.
Базовая агрегация
Чтобы использовать базовую агрегацию данных, используйте aggregate
функцию в объекте HealthConnectClient
. Она принимает объект AggregateRequest
, в который вы добавляете типы метрик и временной диапазон в качестве параметров. То, как вызываются базовые агрегаты, зависит от используемых типов метрик.
Накопительная агрегация
Накопительное агрегирование вычисляет общую стоимость.
В следующем примере показано, как агрегировать данные для определенного типа данных:
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
}
}
Статистическое агрегирование
Статистическое агрегирование вычисляет минимальные, максимальные или средние значения записей с выборками.
В следующем примере показано, как использовать статистическое агрегирование:
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
}
}
Ведра
Health Connect также позволяет вам объединять данные в сегменты . Два типа сегментов, которые вы можете использовать, включают продолжительность и период .
После вызова они возвращают список сегментов. Обратите внимание, что список может быть разреженным, поэтому сегмент не включается в список, если он не содержит никаких данных.
Продолжительность
В этом случае агрегированные данные разбиваются на сегменты в течение фиксированного периода времени, например AggregateGroupByDurationRequest
aggregateGroupByDuration
в который вы добавляете типы метрик, временной диапазон и Duration
в качестве параметров.
Ниже показан пример объединения шагов в блоки длительностью в минуту:
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
}
}
Период
В этом случае агрегированные данные разбиваются на сегменты в течение периода времени, основанного на дате, например AggregateGroupByPeriodRequest
aggregateGroupByPeriod
в который вы добавляете типы метрик, временной диапазон и Period
в качестве параметров.
Ниже показан пример объединения шагов в ежемесячные сегменты:
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
}
}
Прочитать ограничения
По умолчанию все приложения могут считывать данные из Health Connect за период до 30 дней до момента первого предоставления разрешения.
Если вам необходимо расширить разрешения на чтение за пределы ограничений по умолчанию , запросите PERMISSION_READ_HEALTH_DATA_HISTORY
. В противном случае, без этого разрешения, попытка чтения записей старше 30 дней приведет к ошибке.
История разрешений для удаленного приложения
Если пользователь удаляет ваше приложение, все разрешения, включая разрешение на историю, отзываются. Если пользователь переустанавливает ваше приложение и снова предоставляет разрешение, применяются те же ограничения по умолчанию , и ваше приложение может считывать данные из Health Connect в течение 30 дней до этой новой даты.
Например, предположим, что пользователь удаляет ваше приложение 10 мая 2023 года, а затем переустанавливает приложение 15 мая 2023 года и предоставляет разрешения на чтение. Самая ранняя дата, с которой ваше приложение теперь может считывать данные по умолчанию, — это 15 апреля 2023 года .
Сводные данные, на которые влияют выбранные пользователем приоритеты приложений
Конечные пользователи могут устанавливать приоритет для приложений Sleep и Activity, которые они интегрировали с Health Connect. Только конечные пользователи могут изменять эти списки приоритетов. Когда вы выполняете совокупное чтение, API Aggregate учитывает любые дублирующие данные и сохраняет только данные из приложения с наивысшим приоритетом. Дублирующие данные могут существовать, если у пользователя есть несколько приложений, одновременно записывающих одни и те же данные — например, количество сделанных шагов или пройденное расстояние.
Информацию о том, как конечные пользователи могут расставлять приоритеты для своих приложений, см. в разделе Управление данными Health Connect .
Пользователь может добавлять или удалять приложения, а также изменять их приоритеты. Пользователь может захотеть удалить приложение, которое записывает дублирующие данные, чтобы итоговые данные на экране Health Connect были идентичны данным приложения, которому он дал наивысший приоритет. Итоговые данные обновляются в режиме реального времени.
Несмотря на то, что API Aggregate вычисляет данные приложений Activity и Sleep, удаляя дубликаты данных в соответствии с установленными пользователем приоритетами, вы все равно можете создать собственную логику для отдельного расчета данных для каждого приложения, записывающего эти данные.
Health Connect дедуплицирует только типы данных Activity и Sleep, а отображаемые итоговые данные представляют собой значения после дедупликации, выполненной API Aggregate. Эти итоговые данные показывают последний полный день, когда существуют данные о шагах и расстоянии. Для других типов приложений общее количество всех таких приложений отображается в итоговых данных в Health Connect.
Фоновые чтения
Вы можете запросить, чтобы ваше приложение работало в фоновом режиме и считывало данные из Health Connect. Если вы запросите разрешение Background Read , ваш пользователь может предоставить вашему приложению доступ для чтения данных в фоновом режиме.
Поддерживаемые типы агрегированных данных по записям
В этой таблице перечислены все поддерживаемые типы агрегированных данных по записям Health Connect.