本指南与 Health Connect 1.1.0-alpha12 版本兼容。
本指南向您展示了如何在应用中开始使用 Health Connect。
第 1 步:准备 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 应用。
如果您已在 Android 13 及更低版本上将应用与 Health Connect 集成,并希望在 Android 14 上进行迁移,请参阅从 Android 13 迁移到 14。
打开 Health Connect 应用
Health Connect 不再默认显示在主屏幕上。要打开 Health Connect,请前往 “设置” > “应用” > “Health Connect”,或将 Health Connect 添加到您的 “快速设置” 菜单。
此外,Health Connect 要求用户启用屏幕锁定(使用 PIN 码、图案或密码),以便在设备锁定时,Health Connect 中存储的健康数据受到保护,免受恶意方侵害。要设置屏幕锁定,请前往 “设置” > “安全” > “屏幕锁定”。
第 2 步:将 Health Connect SDK 添加到您的应用
Health Connect SDK 负责使用 Health Connect API 发送请求,以对 Health Connect 应用中的数据存储执行操作。
在您的模块级 build.gradle
文件中添加 Health Connect SDK 依赖项
dependencies {
...
implementation "androidx.health.connect:connect-client:1.1.0-rc02"
...
}
有关最新版本,请参阅 Health Connect 发布版本。
第 3 步:配置您的应用
以下部分说明了如何配置您的应用以集成到 Health Connect。
声明权限
访问健康和健身数据是敏感的。Health Connect 对读写操作实施了一层安全保护,以维护用户信任。
在您的应用中,根据所需数据类型在 AndroidManifest.xml
文件中声明读写权限,这些权限应与您在 Play 管理中心声明的访问权限一致。
Health Connect 使用标准的 Android 权限声明格式。使用 <uses-permission>
标签分配权限。将其嵌套在 <manifest>
标签内。
<manifest>
<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"/>
<application>
...
</application>
</manifest>
有关权限及其对应数据类型的完整列表,请参阅 数据类型列表。
显示您应用的隐私政策对话框
您的 Android 清单文件需要包含一个 Activity,用于显示您应用的隐私政策,这是您的应用请求权限的理由,描述了用户数据如何被使用和处理。
声明此 Activity 来处理 ACTION_SHOW_PERMISSIONS_RATIONALE
intent,该 intent 在用户点击 Health Connect 权限屏幕中的 “隐私政策” 链接时发送到应用。
...
<application>
...
<!-- For supported versions through Android 13, create an activity to show the rationale
of Health Connect permissions once users click the privacy policy link. -->
<activity
android:name=".PermissionsRationaleActivity"
android:exported="true">
<intent-filter>
<action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
</intent-filter>
</activity>
<!-- For versions starting Android 14, create an activity alias to show the rationale
of Health Connect permissions once users click the privacy policy link. -->
<activity-alias
android:name="ViewPermissionUsageActivity"
android:exported="true"
android:targetActivity=".PermissionsRationaleActivity"
android:permission="android.permission.START_VIEW_PERMISSION_USAGE">
<intent-filter>
<action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
<category android:name="android.intent.category.HEALTH_PERMISSIONS" />
</intent-filter>
</activity-alias>
...
</application>
...
获取 Health Connect 客户端
HealthConnectClient
是 Health Connect API 的入口点。它允许应用使用 Health Connect 应用中的数据存储。它会自动管理其与底层存储层的连接,并处理所有 IPC 以及出站请求和入站响应的序列化。
要获取客户端实例,请首先在您的 Android 清单文件中声明 Health Connect 包名。
<application> ... </application>
...
<!-- Check if Health Connect is installed -->
<queries>
<package android:name="com.google.android.apps.healthdata" />
</queries>
然后在您的 Activity 中,使用 getSdkStatus
检查 Health Connect 是否已安装。如果已安装,则获取一个 HealthConnectClient
实例。
val availabilityStatus = HealthConnectClient.getSdkStatus(context, providerPackageName)
if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) {
return // early return as there is no viable integration
}
if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) {
// Optionally redirect to package installer to find a provider, for example:
val uriString = "market://details?id=$providerPackageName&url=healthconnect%3A%2F%2Fonboarding"
context.startActivity(
Intent(Intent.ACTION_VIEW).apply {
setPackage("com.android.vending")
data = Uri.parse(uriString)
putExtra("overlay", true)
putExtra("callerId", context.packageName)
}
)
return
}
val healthConnectClient = HealthConnectClient.getOrCreate(context)
// Issue operations with healthConnectClient
第 4 步:向用户请求权限
创建客户端实例后,您的应用需要向用户请求权限。用户必须被允许随时授予或拒绝权限。
为此,请为所需数据类型创建一组权限。请确保此组中的权限已首先在您的 Android 清单文件中声明。
// Create a set of permissions for required data types
val PERMISSIONS =
setOf(
HealthPermission.getReadPermission(HeartRateRecord::class),
HealthPermission.getWritePermission(HeartRateRecord::class),
HealthPermission.getReadPermission(StepsRecord::class),
HealthPermission.getWritePermission(StepsRecord::class)
)
使用 getGrantedPermissions
查看您的应用是否已授予所需权限。如果没有,请使用 createRequestPermissionResultContract
请求这些权限。这将显示 Health Connect 权限屏幕。
// Create the permissions launcher
val requestPermissionActivityContract = PermissionController.createRequestPermissionResultContract()
val requestPermissions = registerForActivityResult(requestPermissionActivityContract) { granted ->
if (granted.containsAll(PERMISSIONS)) {
// Permissions successfully granted
} else {
// Lack of required permissions
}
}
suspend fun checkPermissionsAndRun(healthConnectClient: HealthConnectClient) {
val granted = healthConnectClient.permissionController.getGrantedPermissions()
if (granted.containsAll(PERMISSIONS)) {
// Permissions already granted; proceed with inserting or reading data
} else {
requestPermissions.launch(PERMISSIONS)
}
}
由于用户可以随时授予或撤销权限,因此您的应用需要定期检查已授予的权限,并处理权限丢失的情况。
第 5 步:执行操作
现在一切就绪,在您的应用中执行读写操作。
写入数据
将您的数据组织成记录。查看 Health Connect 中可用的数据类型列表。
val stepsRecord = StepsRecord(
count = 120,
startTime = START_TIME,
endTime = END_TIME,
startZoneOffset = START_ZONE_OFFSET,
endZoneOffset = END_ZONE_OFFSET,
)
然后使用 insertRecords
写入您的记录。
suspend fun insertSteps(healthConnectClient: HealthConnectClient) {
val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(15))
try {
val stepsRecord = StepsRecord(
count = 120,
startTime = startTime,
endTime = endTime,
startZoneOffset = ZoneOffset.UTC,
endZoneOffset = ZoneOffset.UTC,
metadata = Metadata.autoRecorded(
device = Device(type = Device.TYPE_WATCH)
),
)
healthConnectClient.insertRecords(listOf(stepsRecord))
} catch (e: Exception) {
// Run error handling here
}
}
读取数据
您可以使用 readRecords
单独读取您的数据。
suspend fun readStepsByTimeRange(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
try {
val response =
healthConnectClient.readRecords(
ReadRecordsRequest(
StepsRecord::class,
timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
)
)
for (stepRecord in response.records) {
// Process each step record
}
} catch (e: Exception) {
// Run error handling here.
}
}
您也可以使用 aggregate
以聚合方式读取您的数据。
suspend fun aggregateSteps(
healthConnectClient: HealthConnectClient,
startTime: Instant,
endTime: Instant
) {
try {
val response = healthConnectClient.aggregate(
AggregateRequest(
metrics = setOf(StepsRecord.COUNT_TOTAL),
timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
)
)
// The result may be null if no data is available in the time range
val stepCount = response[StepsRecord.COUNT_TOTAL]
} catch (e: Exception) {
// Run error handling here
}
}
视频教程
观看这些视频,它们详细解释了 Health Connect 的功能,以及实现平滑集成的最佳实践指南
资源
查看以下资源,它们将有助于后续开发。
- Health Connect SDK(Jetpack 上可用):在您的应用程序中包含此 SDK 以使用 Health Connect API。
- API 参考:查看 Health Connect API 的 Jetpack 参考。
- 声明数据类型使用:在 Play 管理中心,声明对您的应用读写 Health Connect 数据类型的访问权限。
- 可选的 GitHub 代码示例和 Codelab:查看 GitHub 代码示例仓库和 Codelab 练习,帮助您入门。
后续步骤
查看 “常见工作流”,了解如何在 Health Connect 中执行操作,例如