Health Connect:权限先于记录 · AndroidX 源码指南
AAndroidX 源码指南
设备能力
设备能力 · 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 按时间范围读取。
  • 权限可被撤销,恢复时重新核对;时间范围与时区要正确。

相关页面