读取聚合数据

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