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。这提供了一个 API 界面,用于与 Health Connect API 交互。
- 软件开发套件: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 平台。
- 如何从设备上的数据存储中获益。
- 如何使用 Google 提供的开发者工具验证您的应用。
您将需要什么
- 最新稳定版 Android Studio。
- 搭载 Android SDK 28 (Pie) 或更高版本的 Android 移动设备。
2. 设置
准备 Health Connect 应用
Health Connect 应用负责处理您的应用通过 Health Connect SDK 发送的所有请求。这些请求包括存储数据以及管理其读写访问权限。
对 Health Connect 的访问取决于手机上安装的 Android 版本。以下部分概述了如何处理几个最新的 Android 版本。
Android 14
从 Android 14 (API Level 34) 开始,Health Connect 是 Android 框架的一部分。由于此版本的 Health Connect 是一个框架模块,因此无需进行任何设置。
Android 13 及更低版本
在 Android 13 (API Level 33) 及更低版本上,Health Connect 不是 Android 框架的一部分。因此,您需要从 Google Play 商店安装 Health Connect 应用。扫描二维码安装 Health Connect。
获取示例代码
首先从 GitHub 克隆源代码
git clone https://github.com/android/android-health-connect-codelab.git
示例目录包含此 Codelab 的 start
和 finished
代码。在 Android Studio 的 Project 视图中,您将找到两个模块
start
:此项目的入门代码,您将对其进行修改以完成 Codelab。finished
:此 Codelab 的已完成代码,用于检查您的工作。
探索“start”代码
Codelab 示例应用使用 Jetpack Compose 构建了基本 UI,包含以下屏幕
WelcomeScreen
:这是应用的着陆页,根据 Health Connect 的可用性(已安装、未安装或不支持)显示不同的消息。PrivacyPolicyScreen
:它解释了应用对权限的使用,当用户点击 Health Connect 权限对话框中的隐私政策链接时显示。InputReadingsScreen
:它演示了读写简单的体重记录。ExerciseSessionScreen
:这是用户插入和列出锻炼会话的地方。点击记录时,它会将用户带到ExerciseSessionDetailScreen
以显示与会话相关的更多数据。DifferentialChangesScreen
:它演示了如何获取更改令牌并从 Health Connect 获取新更改。
HealthConnectManager
存储所有与 Health Connect 交互的函数。在此 Codelab 中,我们将逐步指导您完成基本功能。 start
构建中的 <!-- TODO:
字符串在此 Codelab 中有相应的章节,其中提供了示例代码供您插入到项目中。
让我们开始向项目添加 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 已安装在此设备上”和一个菜单抽屉。我们将在后续部分中添加与 Health Connect 交互的功能。
3. 权限控制
Health Connect 建议开发者将权限请求限制在应用中使用的数据类型。全面的权限请求会降低用户对应用的信心,并可能降低用户信任度。如果权限被拒绝两次以上,您的应用将被锁定。因此,权限请求将不再出现。
为此 Codelab,我们只需要以下权限
- 锻炼会话
- 心率
- 步数
- 总消耗卡路里
- 体重
声明权限
您的应用读取或写入的每种数据类型都需要在 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 权限对话框中的隐私政策链接时,此 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>
现在重新打开应用以查看已声明的权限。从菜单抽屉中点击设置以进入 Health Connect 设置屏幕。然后,点击应用权限,您应该会在列表中看到Health Connect Codelab。点击Health Connect Codelab以显示该应用上读写访问的数据类型列表。
请求权限
除了直接将用户带到 Health Connect 设置以管理权限外,您还可以通过 Health Connect API 从您的应用请求权限。请注意,用户可能随时更改权限,因此请确保您的应用检查所需的权限是否可用。在 Codelab 项目中,我们在读取或写入数据之前检查并发送权限请求。
HealthConnectClient
是 Health Connect API 的入口点。在 HealthConnectManager.kt
中,获取一个 HealthConnectClient
实例。
private val healthConnectClient by lazy { HealthConnectClient.getOrCreate(context) }
要在您的应用中启动请求权限对话框,请首先为所需数据类型构建一组权限。您必须仅请求您使用的数据类型的权限。
例如,在记录体重屏幕中,您只需要授予体重的读写权限。我们已在 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()
}
在 Codelab 示例应用中,如果您尚未授予所需数据类型的权限,您可能会在屏幕上看到请求权限按钮。点击请求权限以打开 Health Connect 权限对话框。允许所需的权限并返回到 Codelab 应用。
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()
}
}
现在运行应用。点击记录体重并输入新的千克体重记录。要验证体重记录是否成功写入 Health Connect,请在“设置”中打开 Health Connect 应用,然后转到数据和访问权限 > 身体测量 > 体重 > 查看所有条目。您应该会看到从 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. 读取数据
现在,您已经使用 Codelab 示例应用和 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
)
请求权限
验证后台读取功能可用后,您可以通过点击锻炼会话屏幕上的请求后台读取来请求 PERMISSION_READ_HEALTH_DATA_IN_BACKGROUND 权限。
用户会看到以下提示
用户还可以通过在系统设置中导航到健康连接 > 应用权限 > 健康连接 Codelab > 附加访问权限 > 在后台访问数据来授予后台读取权限
在后台读取数据
利用 WorkManager
安排后台任务。点击在后台读取步数按钮后,应用将在 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
)
请求权限
验证历史读取功能可用后,您可以通过点击锻炼会话屏幕上的请求历史读取来请求 PERMISSION_READ_HEALTH_DATA_HISTORY 权限。
用户会看到以下提示
用户还可以通过在系统设置中导航到健康连接 > 应用权限 > 健康连接 Codelab > 附加访问权限 > 访问过去数据来授予历史读取权限
读取历史数据
授予读取历史数据的权限后,锻炼会话屏幕将显示来自其他应用的过去数据。
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))
}
现在运行应用并转到更改屏幕。首先,启用跟踪更改以获取更改令牌。然后从 Toolbox 或 Codelab 应用中插入体重或锻炼会话。返回更改屏幕并选择获取新更改。您现在应该会看到插入/更新更改。
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,
)
}
现在运行应用并检查您是否可以在记录体重屏幕上看到平均体重。您还可以通过打开锻炼会话屏幕并选择其中一个锻炼会话记录来查看锻炼会话的详细数据。
10. 恭喜
恭喜,您已成功构建您的首个集成 Health Connect 的健康与健身应用。
该应用可以声明权限并请求用户对应用中使用的数据类型进行权限授权。它还可以从 Health Connect 数据存储中读取和写入数据。您还学习了如何使用 Health Connect Toolbox 通过在 Health Connect 数据存储中创建模拟数据来支持您的应用开发。
您现在已经掌握了使您的健康与健身应用成为 Health Connect 生态系统一部分所需的关键步骤。