设备能力
设备能力 · androidx.camera
Health Connect:权限先于记录Camera 1.7.0-alpha03
检查可用性、请求最小权限,并按时间范围读写健康记录。
最后更新 2026-08-01
复制即用:请求权限
val client = HealthConnectClient.getOrCreate(context)
val permissions = setOf(
HealthPermission.getReadPermission(StepsRecord::class),
HealthPermission.getWritePermission(StepsRecord::class),
)
val granted = client.permissionController.getGrantedPermissions()
if (!granted.containsAll(permissions)) {
permissionLauncher.launch(permissions)
}val permissionLauncher = rememberLauncherForActivityResult(
PermissionController.createRequestPermissionResultContract()
) { grantedPermissions ->
// 用户授权结果
}写入记录
val steps = StepsRecord(
count = 8000,
startTime = Instant.parse("2026-07-31T08:00:00Z"),
endTime = Instant.parse("2026-07-31T20:00:00Z"),
startZoneOffset = ZoneOffset.UTC,
endZoneOffset = ZoneOffset.UTC,
)
client.insertRecords(listOf(steps))读取记录(按时间范围)
val response = client.readRecords(
ReadRecordsRequest(
recordType = StepsRecord::class,
timeRangeFilter = TimeRangeFilter.between(
Instant.parse("2026-07-30T00:00:00Z"),
Instant.parse("2026-07-31T00:00:00Z"),
)
)
)
val steps = response.records // List<StepsRecord>权限生命周期
- 不要假设一次授权永久有效:用户可在系统设置撤销权限。
- 应用回到前台/恢复时重新核对
getGrantedPermissions()。 - 只申请功能实际需要的记录类型和读写方向。
常见陷阱
- 未检查可用性:设备不支持 Health Connect 时
getOrCreate抛异常。 - 权限不完整:只写不读或只读不写,操作失败。
- 时间范围缺:
ReadRecordsRequest不带timeRangeFilter读全部(可能很大)。 - 时区错:
startZoneOffset/endZoneOffset要正确,否则跨时区数据偏移。 - 医疗语义:Health Connect 不判断数据医疗意义;应用要自己说明用途。
复制即用
class HealthRepository(private val context: Context) {
private val client by lazy { HealthConnectClient.getOrCreate(context) }
suspend fun ensurePermission(): Boolean {
val needed = setOf(
HealthPermission.getReadPermission(StepsRecord::class),
)
return client.permissionController.getGrantedPermissions().containsAll(needed)
}
suspend fun readTodaySteps(): List<StepsRecord> {
val now = Instant.now()
return client.readRecords(
ReadRecordsRequest(
recordType = StepsRecord::class,
timeRangeFilter = TimeRangeFilter.between(
now.atStartOfDayInUtc(),
now,
),
)
).records
}
}要点
HealthConnectClient.getOrCreate+PermissionController请求最小权限。insertRecords写入;ReadRecordsRequest按时间范围读取。- 权限可被撤销,恢复时重新核对;时间范围与时区要正确。