读取聚合数据

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