在 Health Connect 中聚合数据包括基本聚合或将数据聚合到桶中。以下工作流程将向您展示如何执行这两种操作。
基本聚合
要在您的数据上使用基本聚合,请在您的 HealthConnectClient
对象上使用 aggregate
函数。它接受一个 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 还可以让您将数据聚合到桶中。您可以使用的两种类型的桶包括持续时间和周期。
调用后,它们会返回一个桶列表。请注意,该列表可能是稀疏的,因此如果桶不包含任何数据,则不会将其包含在列表中。
持续时间
在这种情况下,聚合数据将被拆分为固定时间长度内的桶,例如分钟或小时。要将数据聚合到桶中,请使用 aggregateGroupByDuration
。它接受一个 AggregateGroupByDurationRequest
对象,您可以在其中添加指标类型、时间范围和 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
}
}
周期
在这种情况下,聚合数据将被拆分为基于日期的时间段内的桶,例如周或月。要将数据聚合到桶中,请使用 aggregateGroupByPeriod
。它接受一个 AggregateGroupByPeriodRequest
对象,您可以在其中添加指标类型、时间范围和 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
}
}
30 天读取限制
应用可以读取 Health Connect 中最多 30 天前授予任何权限时的的数据。
但是,如果用户删除了您的应用,则权限历史记录将丢失。如果用户重新安装您的应用并再次授予权限,则您的应用可以读取 Health Connect 中最多 30 天前该新日期时的的数据。
示例
如果用户于 2023 年 3 月 30 日首次向您的应用授予读取权限,则您的应用最早可以读取的数据将从2023 年 2 月 28 日开始。
用户在 2023 年 5 月 10 日删除了您的应用。用户决定在 2023 年 5 月 15 日重新安装它并授予读取权限。您的应用现在可以读取数据的最早日期是2023 年 4 月 15 日。