Đo nhiệt độ trên da

Hướng dẫn này tương thích với Health Connect phiên bản 1.1.0-alpha12.

Health Connect cung cấp loại dữ liệu nhiệt độ trên da để đo nhiệt độ cơ thể ở ngoại vi. Chỉ số đo lường này là một tín hiệu đặc biệt hữu ích để phát hiện chất lượng giấc ngủ, sức khoẻ sinh sản và khả năng mắc bệnh.

Kiểm tra phạm vi sử dụng Health Connect

Trước khi cố gắng sử dụng Health Connect, ứng dụng của bạn phải xác minh rằng Health Connect có trên thiết bị của người dùng. Health Connect có thể chưa được cài đặt sẵn trên một số thiết bị hoặc có thể đã bị tắt. Bạn có thể kiểm tra phạm vi cung cấp bằng phương thức HealthConnectClient.getSdkStatus().

Cách kiểm tra phạm vi sử dụng Health Connect

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
}

Tuỳ thuộc vào trạng thái mà getSdkStatus() trả về, bạn có thể hướng dẫn người dùng cài đặt hoặc cập nhật Health Connect từ Cửa hàng Google Play nếu cần.

Phạm vi cung cấp tính năng

Để xác định xem thiết bị của người dùng có hỗ trợ nhiệt độ trên da trên Health Connect hay không, hãy kiểm tra trạng thái của FEATURE_SKIN_TEMPERATURE trên ứng dụng:

if (healthConnectClient
     .features
     .getFeatureStatus(
       HealthConnectFeatures.FEATURE_SKIN_TEMPERATURE
     ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {

  // Feature is available
} else {
  // Feature isn't available
}
Hãy xem phần Kiểm tra phạm vi cung cấp tính năng để tìm hiểu thêm.

Các quyền bắt buộc

Quyền truy cập vào nhiệt độ trên da được bảo vệ bằng các quyền sau:

  • android.permission.health.READ_SKIN_TEMPERATURE
  • android.permission.health.WRITE_SKIN_TEMPERATURE

Để thêm chức năng nhiệt độ trên da vào ứng dụng, hãy bắt đầu bằng cách yêu cầu quyền ghi cho kiểu dữ liệu SkinTemperature.

Dưới đây là quyền bạn cần khai báo để có thể ghi nhiệt độ da:

<application>
  <uses-permission
android:name="android.permission.health.WRITE_SKIN_TEMPERATURE" />
...
</application>

Để đọc dữ liệu về nhiệt độ trên da, bạn cần yêu cầu các quyền sau:

<application>
  <uses-permission
android:name="android.permission.health.READ_SKIN_TEMPERATURE" />
...
</application>

Yêu cầu người dùng cấp quyền

Sau khi tạo một phiên bản ứng dụng, ứng dụng của bạn cần yêu cầu người dùng cấp quyền. Người dùng phải được phép cấp hoặc từ chối cấp quyền bất cứ lúc nào.

Để thực hiện việc này, hãy tạo một tập hợp quyền cho các kiểu dữ liệu bắt buộc. Trước tiên, bạn cần khai báo các quyền trong tập hợp này ở tệp kê khai Android.

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(SkinTemperatureRecord::class),
  HealthPermission.getWritePermission(SkinTemperatureRecord::class)
)

Hãy sử dụng getGrantedPermissions để xem ứng dụng của bạn đã được cấp các quyền cần thiết chưa. Nếu chưa, hãy sử dụng createRequestPermissionResultContract để yêu cầu các quyền đó. Thao tác này sẽ hiện màn hình các quyền của Health Connect.

// 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)
  }
}

Vì người dùng có thể cấp hoặc thu hồi quyền bất cứ lúc nào, nên ứng dụng của bạn cần kiểm tra định kỳ các quyền đã cấp và xử lý các tình huống khi mất quyền.

Thông tin có trong bản ghi nhiệt độ trên da

Các phép đo nhiệt độ trên da được sắp xếp thành bản ghi. Mỗi bản ghi bao gồm những thông tin sau:

  • Nhiệt độ cơ thể, tính bằng độ C hoặc độ F. Đây là một giá trị không bắt buộc và hữu ích nhất cho việc trực quan hoá trong giao diện người dùng của ứng dụng.
  • Danh sách các mức chênh lệch về nhiệt độ trên da, mỗi mức chênh lệch cho biết sự thay đổi về nhiệt độ trên da kể từ lần đo gần đây nhất. Nếu bạn cung cấp nhiệt độ cơ sở, thì các mức chênh lệch này phải sử dụng cùng một đơn vị nhiệt độ.
  • Vị trí trên cơ thể người dùng nơi thực hiện phép đo: ngón tay, ngón chân hoặc cổ tay.

Các phép tổng hợp được hỗ trợ

Bạn có thể sử dụng các giá trị tổng hợp sau đây cho SkinTemperatureRecord:

Ví dụ về cách sử dụng

Các đoạn mã sau đây cho biết cách đọc và ghi các phép đo nhiệt độ da.

Đọc bản ghi nhiệt độ trên da

Đoạn mã sau đây minh hoạ cách đọc các phép đo nhiệt độ da bằng thư viện 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.
    }
}

Ghi dữ liệu về nhiệt độ trên da

Đoạn mã sau đây cho biết cách ghi các phép đo nhiệt độ da bằng thư viện 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)
                ),
            )
        )
    )
}