این راهنما با Health Connect نسخه ۱.۱.۰-alpha۱۲ سازگار است.
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()
، میتوانید در صورت لزوم کاربر را برای نصب یا بهروزرسانی 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_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>
درخواست مجوز از کاربر
پس از ایجاد یک نمونه کلاینت، برنامه شما باید از کاربر درخواست مجوز کند. کاربران باید بتوانند در هر زمانی مجوزها را اعطا یا رد کنند.
برای انجام این کار، مجموعهای از مجوزها را برای انواع دادههای مورد نیاز ایجاد کنید. مطمئن شوید که مجوزهای موجود در مجموعه ابتدا در مانیفست اندروید شما تعریف شدهاند.
// Create a set of permissions for required data types
val PERMISSIONS =
setOf(
HealthPermission.getReadPermission(SkinTemperatureRecord::class),
HealthPermission.getWritePermission(SkinTemperatureRecord::class)
)
برای اینکه ببینید آیا برنامه شما مجوزهای لازم را از قبل دریافت کرده است یا خیر، getGrantedPermissions
استفاده کنید. در غیر این صورت، از createRequestPermissionResultContract
برای درخواست این مجوزها استفاده کنید. این کار صفحه مجوزهای 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)
}
}
از آنجا که کاربران میتوانند در هر زمانی مجوزها را اعطا یا لغو کنند، برنامه شما باید به صورت دورهای مجوزهای اعطا شده را بررسی کند و سناریوهایی را که در آنها مجوز از دست میرود، مدیریت کند.
اطلاعات موجود در ثبت دمای پوست
اندازهگیریهای دمای پوست در پروندههایی سازماندهی میشوند. هر پرونده شامل اطلاعات زیر است:
- دمای پایه ، بر حسب درجه سانتیگراد یا درجه فارنهایت. این یک مقدار اختیاری است که برای تجسم در رابط کاربری برنامه شما بسیار مفید است.
- فهرستی از دلتاها در دمای پوست، که هر کدام تغییر دمای پوست را از آخرین اندازهگیری نشان میدهد. اگر دمای پایه ارائه شده باشد، این دلتاها باید از واحدهای دمایی یکسانی استفاده کنند.
- محلی از بدن کاربر که اندازهگیری در آن انجام شده است: انگشت دست، پا یا مچ دست.
تجمیعهای پشتیبانیشده
مقادیر تجمعی زیر برای 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)
),
)
)
)
}