1. 简介

什么是 Health Connect?
Health Connect 是一个为 Android 应用开发者提供的健康数据平台。它提供了一个单一的整合接口,用于访问用户的健康和健身数据,并确保在所有设备上提供一致的功能表现。借助 Health Connect,用户可以在设备上安全地存储健康和健身数据,并对访问权限拥有完全的控制权和透明度。
Health Connect 如何工作?
Health Connect 支持 50 多种常见的健康和健身数据类型与类别,包括活动、睡眠、营养、身体测量数据以及心率和血压等生命体征。

在获得用户许可的情况下,开发者可以使用标准化的模式和 API 行为安全地读取和写入 Health Connect。用户可以完全控制其隐私设置,并拥有细粒度的控制权,能够随时查看哪些应用正在请求访问数据。Health Connect 中的数据存储在本地设备上并经过加密。用户还可以选择关闭访问权限或删除他们不想保留在设备上的数据,并在使用多个应用时选择优先使用某个数据源。
Health Connect 架构

以下是 Health Connect 的关键方面和架构组件的说明
- 客户端应用:为了与 Health Connect 集成,客户端应用会将 SDK 链接到其健康和健身应用中。这提供了一个与 Health Connect API 交互的 API 界面。
- 软件开发工具包 (SDK):该 SDK 使客户端应用能够与 Health Connect APK 进行通信。
- Health Connect APK:这是实现 Health Connect 的 APK。它包含权限管理和数据管理组件。Health Connect APK 直接在用户的设备上提供,使 Health Connect 以设备为中心,而非以账号为中心。
- 权限管理:Health Connect 包含一个用户界面,应用可以通过该界面请求用户许可来展示数据。它还提供现有用户权限的列表。这允许用户管理他们授予或拒绝给各个应用的访问权限。
- 数据管理:Health Connect 提供了一个用户界面,概述了已记录的数据,无论是用户的步数、骑行速度、心率还是其他支持的数据类型。
你将构建的内容
在本代码实验室(Codelab)中,你将构建一个与 Health Connect 集成的简单健康和健身应用。你的应用将实现以下功能:
- 获取并检查用户的数据访问权限。
- 向 Health Connect 写入数据。
- 从 Health Connect 读取聚合数据。
学习内容
- 如何设置环境以支持 Health Connect 集成开发。
- 如何获取权限并执行权限检查。
- 如何向 Health Connect 平台贡献健康和健身数据。
- 如何利用设备端数据存储的优势。
- 如何使用谷歌提供的开发者工具验证你的应用。
你需要的工具
- 最新稳定版本的 Android Studio。
- 运行 Android SDK 28 (Pie) 或更高版本的 Android 移动设备。
2. 准备工作
准备 Health Connect 应用
Health Connect 应用负责处理你的应用通过 Health Connect SDK 发送的所有请求。这些请求包括存储数据以及管理其读写访问权限。
对 Health Connect 的访问取决于手机上安装的 Android 版本。以下章节概述了如何处理几个较新的 Android 版本。
Android 14
从 Android 14 (API 级别 34) 开始,Health Connect 成为 Android 框架的一部分。由于此版本的 Health Connect 是一个框架模块,因此无需进行任何设置。
Android 13 及更低版本
在 Android 13 (API 级别 33) 及更低版本上,Health Connect 不属于 Android 框架。因此,你需要从 Google Play 商店安装 Health Connect 应用。扫描二维码即可安装 Health Connect。

获取示例代码
首先从 GitHub 克隆源代码
git clone https://github.com/android/android-health-connect-codelab.git
示例目录中包含了本代码实验室的 start(起始)和 finished(完成)代码。在 Android Studio 的 Project 视图中,你会找到两个模块
start:此项目的入门代码,你将在此基础上进行更改以完成代码实验室。finished:此代码实验室的完整代码,用于检查你的工作。
探索 ‘start’ 代码
代码实验室示例应用使用 Jetpack Compose 构建了基础界面,包含以下屏幕:
WelcomeScreen:这是应用的登录页,会根据 Health Connect 的可用性(是否已安装、未安装或不支持)显示不同的消息。PrivacyPolicyScreen:解释应用对权限的使用,当用户点击 Health Connect 权限对话框中的 Privacy policy(隐私政策)链接时显示。InputReadingsScreen:演示读取和写入简单的体重记录。ExerciseSessionScreen:用户在此处插入并列出锻炼会话。点击记录后,会将用户带到ExerciseSessionDetailScreen以显示与该会话相关的更多数据。DifferentialChangesScreen:演示如何获取更改令牌(Changes token)并从 Health Connect 获取新的更改。
HealthConnectManager 存储了所有与 Health Connect 交互的功能。在本代码实验室中,我们将分步引导你完成必要的功能。start 版本中的 <!-- TODO: 字符串在代码实验室中有对应的章节,提供了你需要插入到项目中的示例代码。
让我们从为项目添加 Health Connect 开始吧!
添加 Health Connect 客户端 SDK
要开始使用 Health Connect SDK,你需要向 build.gradle 文件添加依赖项。要查找 Health Connect 的最新版本,请查看 Jetpack 库发布说明。
dependencies {
// Add a dependency of Health Connect SDK
implementation "androidx.health.connect:connect-client:1.1.0-alpha11"
}
声明 Health Connect 可见性
要在应用内与 Health Connect 交互,请在 AndroidManifest.xml 中声明 Health Connect 包名
<!-- TODO: declare Health Connect visibility -->
<queries>
<package android:name="com.google.android.apps.healthdata" />
</queries>
运行 start 项目
一切准备就绪后,运行 start 项目。此时,你应该能看到欢迎屏幕,显示“Health Connect is installed on this device”(Health Connect 已在此设备上安装)字样以及一个菜单抽屉。我们将在后续章节中添加与 Health Connect 交互的功能。

3. 权限控制
Health Connect 建议开发者将权限请求限制为应用中实际使用的数据类型。一揽子权限请求会降低用户对应用的信心,并可能降低用户信任度。如果某个权限被拒绝超过两次,你的应用将被锁定。结果就是,权限请求将不再出现。
在本代码实验室中,我们仅需要以下权限:
- 锻炼会话
- 心率
- 步数
- 总消耗热量
- 体重
声明权限
你的应用读取或写入的每种数据类型都需要在 AndroidManifest.xml 中使用权限进行声明。从 1.0.0-alpha10 版本开始,Health Connect 使用标准的 Android 权限声明格式。
要为所需的数据类型声明权限,请使用 <uses-permission> 元素,并将对应的权限名称分配给它们。将它们嵌套在 <manifest> 标签内。有关权限及其对应数据类型的完整列表,请参阅 数据类型列表。
<!-- TODO: Required to specify which Health Connect permissions the app can request -->
<uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
<uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
<uses-permission android:name="android.permission.health.READ_STEPS"/>
<uses-permission android:name="android.permission.health.WRITE_STEPS"/>
<uses-permission android:name="android.permission.health.READ_EXERCISE"/>
<uses-permission android:name="android.permission.health.WRITE_EXERCISE"/>
<uses-permission android:name="android.permission.health.READ_TOTAL_CALORIES_BURNED"/>
<uses-permission android:name="android.permission.health.WRITE_TOTAL_CALORIES_BURNED"/>
<uses-permission android:name="android.permission.health.READ_WEIGHT"/>
<uses-permission android:name="android.permission.health.WRITE_WEIGHT"/>
在 AndroidManifest.xml 中声明一个 intent 过滤器,以处理解释你的应用如何使用这些权限的 intent。你的应用需要处理此 intent 并显示隐私政策,说明用户数据是如何使用和处理的。当用户点击 Health Connect 权限对话框中的 Privacy policy(隐私政策)链接时,此 intent 会发送到应用。
<!-- TODO: Add intent filter to handle permission rationale intent -->
<!-- Permission handling for Android 13 and before -->
<intent-filter>
<action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
</intent-filter>
<!-- Permission handling for Android 14 and later -->
<intent-filter>
<action android:name="android.intent.action.VIEW_PERMISSION_USAGE"/>
<category android:name="android.intent.category.HEALTH_PERMISSIONS"/>
</intent-filter>
现在重新打开应用以查看已声明的权限。从菜单抽屉中点击 Settings(设置)以进入 Health Connect 设置屏幕。然后,点击 App permissions(应用权限),你应该能在列表中看到 Health Connect Codelab。点击 Health Connect Codelab 以显示该应用的读写访问权限数据类型列表。

请求权限
除了直接引导用户前往 Health Connect 设置来管理权限外,你还可以通过 Health Connect API 从应用中请求权限。请注意,用户可能随时更改权限,因此请确保你的应用检查所需权限是否可用。在代码实验室项目中,我们在读取或写入数据之前会检查并发送权限请求。
HealthConnectClient 是 Health Connect API 的入口点。在 HealthConnectManager.kt 中,获取一个 HealthConnectClient 实例。
private val healthConnectClient by lazy { HealthConnectClient.getOrCreate(context) }
要在应用内启动权限请求对话框,首先要为所需的数据类型构建一个权限集。你必须仅为所使用的数据类型请求权限。
例如,在 Record weight(记录体重)屏幕中,你只需要授予体重的读写权限。我们已在 InputReadingsViewModel.kt 中创建了一个权限集,如下面的代码所示。
val permissions = setOf(
HealthPermission.getReadPermission(WeightRecord::class),
HealthPermission.getWritePermission(WeightRecord::class),
)
然后,在启动权限请求之前检查是否已授予权限。在 HealthConnectManager.kt 中,使用 getGrantedPermissions 来检查是否已授予所需数据类型的权限。要启动权限请求,你必须通过使用 PermissionController.createRequestPermissionResultContract() 创建一个 ActivityResultContract,当未授予所需权限时,应启动该请求。
suspend fun hasAllPermissions(permissions: Set<String>): Boolean {
return healthConnectClient.permissionController.getGrantedPermissions().containsAll(permissions)
}
fun requestPermissionsActivityContract(): ActivityResultContract<Set<String>, Set<String>> {
return PermissionController.createRequestPermissionResultContract()
}
在代码实验室示例应用中,如果你尚未向所需数据类型授予权限,你可能会在屏幕上看到 Request permissions(请求权限)按钮。点击 Request permissions 打开 Health Connect 权限对话框。允许所需的权限,然后返回代码实验室应用。

4. 写入数据
让我们开始向 Health Connect 写入记录。要写入体重记录,创建一个带有体重输入值的 WeightRecord 对象。请注意,Health Connect SDK 支持各种 单位 类。例如,使用 Mass.kilograms(weightInput) 以公斤为单位设置用户的体重。
所有写入 Health Connect 的数据都应指定时区偏移信息。在写入数据时指定时区偏移信息,可以在 Health Connect 中读取数据时提供时区信息。
创建体重记录后,使用 healthConnectClient.insertRecords 将数据写入 Health Connect。
/**
* TODO: Writes [WeightRecord] to Health Connect.
*/
suspend fun writeWeightInput(weightInput: Double) {
val time = ZonedDateTime.now().withNano(0)
val weightRecord = WeightRecord(
metadata = Metadata.manualEntry(),
weight = Mass.kilograms(weightInput),
time = time.toInstant(),
zoneOffset = time.offset
)
val records = listOf(weightRecord)
try {
healthConnectClient.insertRecords(records)
Toast.makeText(context, "Successfully insert records", Toast.LENGTH_SHORT).show()
} catch (e: Exception) {
Toast.makeText(context, e.message.toString(), Toast.LENGTH_SHORT).show()
}
}
现在运行应用。点击 Record weight(记录体重)并以公斤为单位输入一条新的体重记录。要验证体重记录是否已成功写入 Health Connect,请打开“设置”中的 Health Connect 应用,然后转到 Data and access > Body measurements > Weight > See all entries(数据和访问 > 身体测量 > 体重 > 查看所有条目)。你应该能看到从 Health Connect Codelab 写入的新体重记录。
写入锻炼会话
会话是用户执行活动的时间间隔。Health Connect 中的锻炼会话可以包含从跑步到羽毛球等任何活动。会话允许用户衡量基于时间的表现。此数据记录了一段时间内测量的一系列瞬时样本,例如活动期间的持续心率或位置样本。
以下示例展示了如何写入锻炼会话。使用 healthConnectClient.insertRecords 插入与会话相关的多条数据记录。本示例中的插入请求包括带有 ExerciseType 的 ExerciseSessionRecord、带有步数的 StepsRecord、带有 Energy 的 TotalCaloriesBurnedRecord,以及一系列 HeartRateRecord 样本。
/**
* TODO: Writes an [ExerciseSessionRecord] to Health Connect.
*/
suspend fun writeExerciseSession(start: ZonedDateTime, end: ZonedDateTime) {
healthConnectClient.insertRecords(
listOf(
ExerciseSessionRecord(
metadata = Metadata.manualEntry(),
startTime = start.toInstant(),
startZoneOffset = start.offset,
endTime = end.toInstant(),
endZoneOffset = end.offset,
exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
title = "My Run #${Random.nextInt(0, 60)}"
),
StepsRecord(
metadata = Metadata.manualEntry(),
startTime = start.toInstant(),
startZoneOffset = start.offset,
endTime = end.toInstant(),
endZoneOffset = end.offset,
count = (1000 + 1000 * Random.nextInt(3)).toLong()
),
TotalCaloriesBurnedRecord(
metadata = Metadata.manualEntry(),
startTime = start.toInstant(),
startZoneOffset = start.offset,
endTime = end.toInstant(),
endZoneOffset = end.offset,
energy = Energy.calories((140 + Random.nextInt(20)) * 0.01)
)
) + buildHeartRateSeries(start, end)
)
}
/**
* TODO: Build [HeartRateRecord].
*/
private fun buildHeartRateSeries(
sessionStartTime: ZonedDateTime,
sessionEndTime: ZonedDateTime,
): HeartRateRecord {
val samples = mutableListOf<HeartRateRecord.Sample>()
var time = sessionStartTime
while (time.isBefore(sessionEndTime)) {
samples.add(
HeartRateRecord.Sample(
time = time.toInstant(),
beatsPerMinute = (80 + Random.nextInt(80)).toLong()
)
)
time = time.plusSeconds(30)
}
return HeartRateRecord(
metadata = Metadata.manualEntry(),
startTime = sessionStartTime.toInstant(),
startZoneOffset = sessionStartTime.offset,
endTime = sessionEndTime.toInstant(),
endZoneOffset = sessionEndTime.offset,
samples = samples
)
}
5. 读取数据
既然你已经通过代码实验室示例应用和 Toolbox 应用写入了体重和锻炼会话记录,现在让我们使用 Health Connect API 读取这些记录。首先,创建一个 ReadRecordsRequest 并指定记录类型和要读取的时间范围。ReadRecordsRequest 还可以设置 dataOriginFilter 以指定你要读取的记录的来源应用。
/**
* TODO: Reads in existing [WeightRecord]s.
*/
suspend fun readWeightInputs(start: Instant, end: Instant): List<WeightRecord> {
val request = ReadRecordsRequest(
recordType = WeightRecord::class,
timeRangeFilter = TimeRangeFilter.between(start, end)
)
val response = healthConnectClient.readRecords(request)
return response.records
}
/**
* TODO: Obtains a list of [ExerciseSessionRecord]s in a specified time frame.
*/
suspend fun readExerciseSessions(start: Instant, end: Instant): List<ExerciseSessionRecord> {
val request = ReadRecordsRequest(
recordType = ExerciseSessionRecord::class,
timeRangeFilter = TimeRangeFilter.between(start, end)
)
val response = healthConnectClient.readRecords(request)
return response.records
}
现在运行应用,检查是否能看到体重记录和锻炼会话列表。

6. 在后台读取数据
声明权限
要在后台访问健康数据,请在 AndroidManifest.xml 文件中声明 READ_HEALTH_DATA_IN_BACKGROUND 权限。
<!-- TODO: Required to specify which Health Connect permissions the app can request -->
...
<uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
检查功能可用性
由于用户可能并不总是拥有最新版本的 Health Connect,最好先验证 功能可用性。在 HealthConnectManager.kt 中,我们使用 getFeatureStatus() 方法来实现这一点。
fun isFeatureAvailable(feature: Int): Boolean{
return healthConnectClient
.features
.getFeatureStatus(feature) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE
}
ExerciseSessionViewModel.kt 中的后台读取功能使用 FEATURE_READ_HEALTH_DATA_IN_BACKGROUND 常量进行验证
backgroundReadAvailable.value = healthConnectManager.isFeatureAvailable(
HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_IN_BACKGROUND
)
请求权限
在验证后台读取功能可用后,你可以通过点击 Exercise sessions(锻炼会话)屏幕上的 Request Background Read(请求后台读取)来请求 PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND 权限。
用户将看到以下提示

用户也可以通过导航至系统设置中的 Health Connect > App permissions > Health Connect Codelab > Additional access > Access data in the background(Health Connect > 应用权限 > Health Connect Codelab > 额外访问权限 > 在后台访问数据)来授予后台读取权限

在后台读取数据
利用 WorkManager 来调度后台任务。点击 Read Steps In Background(在后台读取步数)按钮后,应用将在 10 秒延迟后启动 ReadStepWorker。此工作器将从 Health Connect 中获取过去 24 小时的总步数。随后,类似的详细日志条目将出现在 Logcat 中
There are 4000 steps in Health Connect in the last 24 hours.
7. 读取历史数据
声明权限
要访问其他应用中超过 30 天的健康数据,请在 AndroidManifest.xml 文件中声明 READ_HEALTH_DATA_HISTORY 权限。
<!-- TODO: Required to specify which Health Connect permissions the app can request -->
...
<uses-permission android:name="android.permission.health.READ_HEALTH_DATA_HISTORY" />
检查功能可用性
由于用户可能并不总是拥有最新版本的 Health Connect,最好先验证 功能可用性。在 HealthConnectManager.kt 中,我们使用 getFeatureStatus() 方法来实现这一点。
fun isFeatureAvailable(feature: Int): Boolean{
return healthConnectClient
.features
.getFeatureStatus(feature) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE
}
ExerciseSessionViewModel.kt 中的历史记录读取功能使用 FEATURE_READ_HEALTH_DATA_HISTORY 常量进行验证
historyReadAvailable.value = healthConnectManager.isFeatureAvailable(
HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_HISTORY
)
请求权限
在验证历史记录读取功能可用后,你可以通过点击 Exercise sessions(锻炼会话)屏幕上的 Request History Read(请求历史记录读取)来请求 PERMISSION_READ_HEALTH_DATA_HISTORY 权限。
用户将看到以下提示

用户也可以通过导航至系统设置中的 Health Connect > App permissions > Health Connect Codelab > Additional access > Access past data(Health Connect > 应用权限 > Health Connect Codelab > 额外访问权限 > 访问过去的数据)来授予历史记录读取权限

读取历史数据
一旦授予了读取历史记录的权限,Exercise sessions(锻炼会话)屏幕将显示来自其他应用的过去数据。
8. 读取差异化数据
Health Connect 差异化更改 API 有助于跟踪特定数据类型集从某个特定时间点以来的更改。例如,你可能想知道用户是否在你的应用之外更新或删除了任何现有记录,以便你能相应地更新你的数据库。
从 Health Connect 读取数据仅限于在前台运行的应用。此限制旨在进一步加强用户隐私。它通知并向用户保证,Health Connect 没有读取其数据的后台权限,并且数据仅在前台读取和访问。当应用处于前台时,差异化更改 API 使开发者能够通过部署更改令牌来检索 Health Connect 所做的更改。
在 HealthConnectManager.kt 中有两个函数,分别是 getChangesToken() 和 getChanges()。我们将添加差异化更改 API 到这些函数以获取数据更改。
初始更改令牌设置
仅当你的应用使用更改令牌请求时,数据更改才会从 Health Connect 中检索。更改令牌表示提交历史记录中的一个点,差异化数据将从此点开始获取。
要获取更改令牌,请发送带有你要跟踪的数据类型集的 ChangesTokenRequest。保留此令牌,并在想要从 Health Connect 检索任何更新时使用它。
/**
* TODO: Obtains a Changes token for the specified record types.
*/
suspend fun getChangesToken(): String {
return healthConnectClient.getChangesToken(
ChangesTokenRequest(
setOf(
ExerciseSessionRecord::class
)
)
)
}
使用更改令牌更新数据
当你想要获取自应用上次与 Health Connect 同步以来的更改时,请使用你之前获得的更改令牌,并使用该令牌发送 getChanges 调用。ChangesResponse 会返回 Health Connect 中观察到的更改列表,例如 UpsertionChange(更新/插入更改)和 DeletionChange(删除更改)。
/**
* TODO: Retrieve changes from a Changes token.
*/
suspend fun getChanges(token: String): Flow<ChangesMessage> = flow {
var nextChangesToken = token
do {
val response = healthConnectClient.getChanges(nextChangesToken)
if (response.changesTokenExpired) {
throw IOException("Changes token has expired")
}
emit(ChangesMessage.ChangeList(response.changes))
nextChangesToken = response.nextChangesToken
} while (response.hasMore)
emit(ChangesMessage.NoMoreChanges(nextChangesToken))
}
现在运行应用并转到 Changes(更改)屏幕。首先,启用 Track changes(跟踪更改)以获取更改令牌。然后从 Toolbox 或代码实验室应用中插入体重或锻炼会话。回到 Changes 屏幕并选择 Get new changes(获取新更改)。现在你应该能看到更新/插入更改。

9. 聚合数据
Health Connect 还通过聚合 API 提供聚合数据。以下示例展示了如何从 Health Connect 获取累计数据和统计数据。
使用 healthConnectClient.aggregate 发送 AggregateRequest。在聚合请求中,指定一组聚合指标和你想要获取的时间范围。例如,ExerciseSessionRecord.EXERCISE_DURATION_TOTAL 和 StepsRecord.COUNT_TOTAL 提供累计数据,而 WeightRecord.WEIGHT_AVG、HeartRateRecord.BPM_MAX 和 HeartRateRecord.BPM_MIN 提供统计数据。
/**
* TODO: Returns the weekly average of [WeightRecord]s.
*/
suspend fun computeWeeklyAverage(start: Instant, end: Instant): Mass? {
val request = AggregateRequest(
metrics = setOf(WeightRecord.WEIGHT_AVG),
timeRangeFilter = TimeRangeFilter.between(start, end)
)
val response = healthConnectClient.aggregate(request)
return response[WeightRecord.WEIGHT_AVG]
}
此示例展示了如何为特定的锻炼会话获取相关的聚合数据。首先,使用 uid 通过 healthConnectClient.readRecord 读取记录。然后,使用锻炼会话的 startTime 和 endTime 作为时间范围,并将 dataOrigin 作为过滤器来读取相关的聚合数据。
/**
* TODO: Reads aggregated data and raw data for selected data types, for a given [ExerciseSessionRecord].
*/
suspend fun readAssociatedSessionData(
uid: String,
): ExerciseSessionData {
val exerciseSession = healthConnectClient.readRecord(ExerciseSessionRecord::class, uid)
// Use the start time and end time from the session, for reading raw and aggregate data.
val timeRangeFilter = TimeRangeFilter.between(
startTime = exerciseSession.record.startTime,
endTime = exerciseSession.record.endTime
)
val aggregateDataTypes = setOf(
ExerciseSessionRecord.EXERCISE_DURATION_TOTAL,
StepsRecord.COUNT_TOTAL,
TotalCaloriesBurnedRecord.ENERGY_TOTAL,
HeartRateRecord.BPM_AVG,
HeartRateRecord.BPM_MAX,
HeartRateRecord.BPM_MIN,
)
// Limit the data read to just the application that wrote the session. This may or may not
// be desirable depending on the use case: In some cases, it may be useful to combine with
// data written by other apps.
val dataOriginFilter = setOf(exerciseSession.record.metadata.dataOrigin)
val aggregateRequest = AggregateRequest(
metrics = aggregateDataTypes,
timeRangeFilter = timeRangeFilter,
dataOriginFilter = dataOriginFilter
)
val aggregateData = healthConnectClient.aggregate(aggregateRequest)
val heartRateData = readData<HeartRateRecord>(timeRangeFilter, dataOriginFilter)
return ExerciseSessionData(
uid = uid,
totalActiveTime = aggregateData[ExerciseSessionRecord.EXERCISE_DURATION_TOTAL],
totalSteps = aggregateData[StepsRecord.COUNT_TOTAL],
totalEnergyBurned = aggregateData[TotalCaloriesBurnedRecord.ENERGY_TOTAL],
minHeartRate = aggregateData[HeartRateRecord.BPM_MIN],
maxHeartRate = aggregateData[HeartRateRecord.BPM_MAX],
avgHeartRate = aggregateData[HeartRateRecord.BPM_AVG],
heartRateSeries = heartRateData,
)
}
现在运行应用,检查是否能在 Record weight(记录体重)屏幕上看到平均体重。你也可以通过打开 Exercise sessions(锻炼会话)屏幕并选择其中一条锻炼会话记录来查看锻炼会话的详细数据。

10. 恭喜
恭喜,你已经成功构建了第一个集成了 Health Connect 的健康和健身应用。
该应用可以声明权限并请求用户对应用中使用的数据类型授予权限。它还可以从 Health Connect 数据存储中读取和写入数据。你还学习了如何通过在 Health Connect 数据存储中创建模拟数据来使用 Health Connect Toolbox 支持你的应用开发。
现在你已经了解了使你的健康和健身应用成为 Health Connect 生态系统一部分的关键步骤。