ヘルスコネクトは、末梢体温を測定するための皮膚温データ型を提供します。この測定値は、睡眠の質、生殖の健康、病気の可能性を検出するうえで特に有用なシグナルです。
ヘルスコネクトの可用性を確認する
ヘルスコネクトを使用する前に、アプリはユーザーのデバイスでヘルスコネクトが利用可能であることを確認する必要があります。ヘルスコネクトは、一部のデバイスにプリインストールされていない場合や、無効になっている場合があります。HealthConnectClient.getSdkStatus() メソッドを使用して、利用可能かどうかを確認できます。
ヘルスコネクトの可用性を確認する方法
fun checkHealthConnectAvailability(context: Context) { val providerPackageName = "com.google.android.apps.healthdata" // Or get from HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME val availabilityStatus = HealthConnectClient.getSdkStatus(context, providerPackageName) if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) { // Health Connect is not available. Guide the user to install/enable it. // For example, show a dialog. return // early return as there is no viable integration } if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) { // Health Connect is available but requires an update. // 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 } // Health Connect is available, obtain a HealthConnectClient instance val healthConnectClient = HealthConnectClient.getOrCreate(context) // Issue operations with healthConnectClient }
getSdkStatus() から返されたステータスに応じて、必要に応じて Google Play ストアからヘルスコネクトをインストールまたは更新するようユーザーに案内できます。
機能の提供状況
ユーザーのデバイスがヘルスコネクトの皮膚温に対応しているかどうかを判断するには、クライアントで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 での可視化に最も役立つオプションの値です。
- 皮膚温のデルタのリスト。それぞれに、前回の測定からの皮膚温の変化が表示されます。基準温度が指定されている場合、これらのデルタは同じ温度単位を使用する必要があります。
- 測定が行われたユーザーの身体の部位(指、足の指、手首)。
サポートされている集計
SkinTemperatureRecord で使用できる集計値は次のとおりです。
使用例
次のコード スニペットは、皮膚温の測定値を読み書きする方法を示しています。
皮膚温の記録を読み取る
次のコード スニペットは、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)
                ),
            )
        )
    )
}
