このガイドは、Health Connect バージョン 1.1.0-alpha12 に対応しています。
ヘルスコネクトには、末端の体温を測定する皮膚温データ型が用意されています。この測定は、睡眠の質、生殖衛生、病気の発生の可能性を検出するために特に有用なシグナルです。
必要な権限
ヘルスコネクトの他のどのデータタイプと同様に、皮膚温へのアクセスは、READ_SKIN_TEMPERATURE
と WRITE_SKIN_TEMPERATURE
の 2 つの権限によって保護されています。
ユーザーに権限をリクエストする
クライアント インスタンスを作成した後、アプリはユーザーに権限をリクエストする必要があります。ユーザーがいつでも権限を付与または拒否できるようにする必要があります。
そのためには、必要なデータ型の権限セットを作成します。まず、セット内の権限が Android マニフェストで宣言されていることを確認します。
// Create a set of permissions for required data types
val PERMISSIONS =
setOf(
HealthPermission.getReadPermission(SkinTemperatureRecord::class),
HealthPermission.getWritePermission(SkinTemperatureRecord::class)
)
getGrantedPermissions
を使用して、アプリが必要な権限をすでに持っているかどうかを確認します。持っていない場合は、createRequestPermissionResultContract
を使用して権限をリクエストします。ヘルスコネクトの権限画面が表示されます。
// 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)
}
}
ユーザーはいつでも権限を付与または取り消すことができるため、アプリは許可されている権限を定期的に確認し、権限が失われた場合に対処する必要があります。
皮膚温レコードに含まれる情報
皮膚温の測定結果はレコードに整理されます。各レコードは次の情報で構成されます。
- ベースライン温度(摂氏または華氏)。これは省略可能な値で、アプリの UI での可視化に最も役立ちます。
- 皮膚温のデルタのリスト。それぞれに、前回の測定からの皮膚温の変化が表示されます。ベースライン温度が指定されている場合は、これらの差分には同じ温度単位を使用する必要があります。
- 測定が行われたユーザーの身体の部位(指、つま先、手首)。
サポートされている集計
ヘルスコネクトでは、特定の差分リストについて次の集計値を取得できます。
- 最小値
- 最大値
- 平均値
皮膚温を読み取る
次のコード スニペットは、Jetpack ライブラリを使用して皮膚温度の測定値を読み取る方法を示しています。
suspend fun readSkinTemperatures() {
// Error handling, permission check, and feature availability check
// aren't included.
// Record includes measurements during the past hour.
val recordEndTime = Instant.now()
val recordStartTime = recordEndTime.minusSeconds(60 * 60)
val response = healthConnectClient.readRecords(
ReadRecordsRequest<SkinTemperatureRecord>(
timeRangeFilter = TimeRangeFilter.between(
recordStartTime, recordEndTime
)
)
)
for (skinTemperatureRecord in response.records) {
// Process each skin temperature record here.
}
}
皮膚温を書き込む
次のコード スニペットは、Jetpack ライブラリを使用して皮膚温度の測定値を書き込成する方法を示しています。
suspend fun writeSkinTemperatures(): InsertRecordsResponse {
// Error handling, permission check, and feature availability check
// aren't included.
// Record includes measurements during the past hour.
val recordEndTime: ZonedDateTime = now()
val recordStartTime: ZonedDateTime = recordEndTime.minusHours(1)
healthConnectClient.insertRecords(
// For this example, there's only one skin temperature record.
listOf(
SkinTemperatureRecord(
baseline = Temperature.celsius(37.0),
startTime = recordStartTime.toInstant(),
startZoneOffset = recordStartTime.offset,
endTime = recordEndTime.toInstant(),
endZoneOffset = recordEndTime.offset,
deltas = listOf(
SkinTemperatureRecord.Delta(
recordEndTime.minusMinutes(50).toInstant(), celsius(0.5)
), SkinTemperatureRecord.Delta(
recordEndTime.minusMinutes(30).toInstant(), celsius(-0.7)
)
),
measurementLocation = SkinTemperatureRecord.MEASUREMENT_LOCATION_FINGER,
metadata = Metadata.autoRecorded(
device = Device(type = Device.TYPE_RING)
),
)
)
)
}