このガイドは、Health Connect バージョン 1.1.0-alpha12 に対応しています。
ヘルスコネクトは、末梢体温を測定するための皮膚温データ型を提供します。この測定値は、睡眠の質、生殖の健康、病気の可能性を検出するうえで特に有用なシグナルです。
機能の提供状況
ユーザーのデバイスがヘルスコネクトの皮膚温に対応しているかどうかを判断するには、クライアントでFEATURE_SKIN_TEMPERATURE
の可用性を確認します。
if (healthConnectClient
.features
.getFeatureStatus(
HealthConnectFeatures.FEATURE_SKIN_TEMPERATURE
) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {
// Feature is available
} else {
// Feature isn't available
}
詳しくは、機能の提供状況を確認するをご覧ください。
必要な権限
皮膚温へのアクセスは、次の権限によって保護されています。
android.permission.health.READ_SKIN_TEMPERATURE
android.permission.health.WRITE_SKIN_TEMPERATURE
皮膚温機能をアプリに追加するには、まず、SkinTemperature
データ型に対する書き込み権限をリクエストします。
皮膚温を書き込むために宣言する必要がある権限は次のとおりです。
<application>
<uses-permission
android:name="android.permission.health.WRITE_SKIN_TEMPERATURE" />
...
</application>
皮膚温を読み取るには、次の権限をリクエストする必要があります。
<application>
<uses-permission
android:name="android.permission.health.READ_SKIN_TEMPERATURE" />
...
</application>
ユーザーに権限をリクエストする
クライアント インスタンスを作成した後、アプリはユーザーに権限をリクエストする必要があります。ユーザーがいつでも権限を付与または拒否できるようにする必要があります。
そのためには、必要なデータ型の権限セットを作成します。まず、セット内の権限が 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 ライブラリを使用して皮膚温の測定値を読み書きします。
皮膚温を読み取る
次のコード スニペットは、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)
),
)
)
)
}