يتوافق هذا الدليل مع الإصدار 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()
، يمكنك توجيه المستخدم
لتثبيت تطبيق 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>
طلب الأذونات من المستخدم
بعد إنشاء مثيل للعميل، يحتاج تطبيقك إلى طلب أذونات من المستخدم. يجب السماح للمستخدمين بمنح الأذونات أو رفضها في أي وقت.
لإجراء ذلك، أنشئ مجموعة من الأذونات لأنواع البيانات المطلوبة. تأكَّد أولاً من أنّ الأذونات في المجموعة مضمّنة في بيان Android.
// 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)
),
)
)
)
}