在 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 日**。