המדריך הזה תואם לגרסה 1.1.0-alpha12 של Health Connect ואילך.
אפליקציית Health Connect מספקת סוג נתונים של טמפרטורת העור כדי למדוד את טמפרטורת הגוף ההיקפית. המדד הזה הוא אות שימושי במיוחד לזיהוי איכות השינה, בריאות מערכת הרבייה והתחלה אפשרית של מחלה.
איך בודקים אם אפליקציית Health Connect זמינה
לפני שמנסים להשתמש ב-Health Connect, האפליקציה צריכה לוודא שהשירות זמין במכשיר של המשתמש. יכול להיות שאפליקציית Health Connect לא מותקנת מראש בחלק מהמכשירים או שהיא מושבתת.
אפשר לבדוק את הזמינות באמצעות ה-method 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)
),
)
)
)
}