این راهنما با نسخه 1.1.0-alpha12 از Health Connect سازگار است.
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" // 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_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)
),
)
)
)
}