این راهنما با Health Connect نسخه 1.1.0-alpha12 یا بالاتر سازگار است.
Health Connect نوع داده دمای پوست را برای اندازهگیری دمای محیطی بدن ارائه میدهد. این اندازهگیری بهویژه سیگنال مفیدی برای تشخیص کیفیت خواب، بهداشت باروری، و شروع احتمالی بیماری است.
بررسی دردسترس بودن Health Connect
قبلاز تلاش برای استفاده از Health Connect، برنامهتان باید بررسی کند که Health Connect در دستگاه کاربر دردسترس باشد. ممکن است Health Connect در همه دستگاهها ازپیش نصب نشده باشد یا غیرفعال باشد.
میتوانید بااستفاده از روش HealthConnectClient.getSdkStatus()
دردسترس بودن را بررسی کنید.
نحوه بررسی دردسترس بودن Health Connect
fun checkHealthConnectAvailability(context: Context) { val providerPackageName = "com.google.android.apps.healthdata" 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() برمیگرداند، میتوانید کاربر را راهنمایی کنید
تا درصورت لزوم Health Connect را از «فروشگاه Google Play» نصب یا بهروز کند.
دردسترس بودن ویژگی
برای تعیین اینکه آیا دستگاه کاربر از دمای پوست در Health Connect پشتیبانی میکند یا نه، دردسترس بودن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_TEMPERATUREandroid.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 شما اعلام شده باشد.
val permissions = setOf( HealthPermission.getReadPermission(SkinTemperatureRecord::class), HealthPermission.getWritePermission(SkinTemperatureRecord::class) )
getGrantedPermissions
استفاده کنید تا ببینید آیا اجازههای لازم قبلاً به برنامهتان اعطا شده است یا نه. اگر نه، از
createRequestPermissionResultContract
برای درخواست آن اجازهها استفاده کنید. با این کار، صفحه اجازههای Health Connect نمایش داده میشود.
val permissions = setOf( HealthPermission.getReadPermission(StepsRecord::class), HealthPermission.getWritePermission(StepsRecord::class), HealthPermission.getReadPermission(HeartRateRecord::class), HealthPermission.getWritePermission(HeartRateRecord::class) ) val requestPermissionsLauncher = rememberLauncherForActivityResult( contract = PermissionController.createRequestPermissionResultContract() ) { grantedPermissions -> if (grantedPermissions.containsAll(permissions)) { coroutineScope.launch { snackbarHostState.showSnackbar("Permissions granted!") } } else { coroutineScope.launch { snackbarHostState.showSnackbar("Permissions denied.") } } }
اطلاعات موجود در سابقه دمای پوست
اندازهگیریهای دمای پوست در سوابق سازماندهی شده است. هر سابقه شامل اطلاعات زیر است:
- دمای پایه، به درجه سلسیوس یا درجه فارنهایت. این مقداری اختیاری است که برای تجسم در میانای کاربر برنامهتان بسیار مفید است.
- فهرستی از دلتاها در دمای پوست، که هرکدام تغییر دمای پوست را از آخرین اندازهگیری نشان میدهد. اگر دمای خط مبنا ارائه شده باشد، این دلتاها باید از همان واحدهای دما استفاده کنند.
- مکان اندازهگیری در بدن کاربر: انگشت دست، انگشت پا، یا مچ دست.
تجمیعهای پشتیبانیشده
مقادیر مجموع زیر برای
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)
),
)
)
)
}