המדריך הזה תואם לגרסה 1.1.0-alpha12 של Health Connect.
במדריך הזה מוסבר איך מתחילים להשתמש ב-Health Connect באפליקציה.
שלב 1: מכינים את אפליקציית Health Connect
אפליקציית Health Connect אחראית לטפל בכל הבקשות שהאפליקציה שולחת דרך Health Connect SDK. הבקשות האלה כוללות אחסון נתונים וניהול הגישה לקריאה ולכתיבה שלהם.
הגישה ל-Health Connect תלויה בגרסת Android שמותקנת בטלפון. בקטעים הבאים מוסבר איך לטפל בכמה גרסאות עדכניות של Android.
Android 14
החל מ-Android 14 (רמת API 34), Health Connect היא חלק מ-Android Framework. הגרסה הזו של Health Connect היא מודול framework, ולכן לא צריך להגדיר אותה.
Android מגרסה 13 ומטה
ב-Android 13 (רמת API 33) ובגרסאות קודמות, Health Connect לא נכלל ב-Android Framework. לכן, צריך להתקין את אפליקציית Health Connect מחנות Google Play.
אם שילבתם את האפליקציה שלכם עם Health Connect ב-Android מגרסה 13 ומטה, ואתם רוצים לבצע מיגרציה ב-Android 14, כדאי לעיין במאמר בנושא מיגרציה מ-Android 13 ל-14.
פותחים את אפליקציית Health Connect.
אפליקציית Health Connect לא מופיעה יותר במסך הבית כברירת מחדל. אפשר לפתוח את Health Connect דרך ההגדרות, אבל הנתיב משתנה בהתאם לגרסת Android:
- ב-Android 14 ואילך: עוברים אל הגדרות > אבטחה ופרטיות > אמצעי בקרה על פרטיות > Health Connect, או מחפשים את Health Connect בהגדרות.
- ב-Android מגרסה 13 ומטה: עוברים אל הגדרות > אפליקציות > Health Connect, או מוסיפים את Health Connect לתפריט ההגדרות המהירות.
שלב 2: מוסיפים את Health Connect SDK לאפליקציה
Health Connect SDK אחראי לשימוש ב-Health Connect API כדי לשלוח בקשות לביצוע פעולות במאגר הנתונים באפליקציית Health Connect.
מוסיפים את התלות ב-Health Connect SDK לקובץ build.gradle ברמת המודול:
dependencies {
...
implementation "androidx.health.connect:connect-client:1.2.0-alpha04"
...
}
הגרסה העדכנית מופיעה בגרסאות של Health Connect.
שימוש בתכונות של ערוץ ההפצה Canary
כדי להשתמש בתכונות בערוץ ההפצה Canary, משנים את הגרסה של compileSdk בקובץ build.gradle ברמת המודול:
android {
compileSdkPreview = "CANARY"
}
שלב 3: מגדירים את האפליקציה
בקטעים הבאים מוסבר איך להגדיר את האפליקציה כך שתשתלב עם Health Connect.
בדיקת זמינות של תכונות
כשמוסיפים תכונות חדשות ל-Health Connect, המשתמשים לא תמיד מעדכנים את הגרסה של Health Connect. Feature Availability API מאפשר לבדוק אם תכונה מסוימת ב-Health Connect זמינה במכשיר של המשתמש, ולקבוע איזו פעולה לבצע.
הפונקציה העיקרית לבדיקת זמינות התכונה היא getFeatureStatus(). היא מחזירה קבועי מספרים שלמים FEATURE_STATUS_AVAILABLE או FEATURE_STATUS_UNAVAILABLE:
@OptIn(ExperimentalFeatureAvailabilityApi::class) fun enqueueBackgroundReadWorker(context: Context, healthConnectClient: HealthConnectClient) { if (healthConnectClient .features .getFeatureStatus( HealthConnectFeatures.FEATURE_READ_HEALTH_DATA_IN_BACKGROUND ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE ) { val periodicWorkRequest = PeriodicWorkRequestBuilder<ScheduleWorker>(1, TimeUnit.HOURS) .build() WorkManager.getInstance(context).enqueueUniquePeriodicWork( "read_health_connect", ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest ) } }
הצהרה על הרשאות
הגישה לנתונים של אימוני כושר ובריאות היא רגישה. ב-Health Connect מיושם שכבת אבטחה לפעולות קריאה וכתיבה, כדי לשמור על אמון המשתמשים.
באפליקציה, צריך להצהיר על הרשאות קריאה וכתיבה בקובץ AndroidManifest.xml על סמך סוגי הנתונים הנדרשים, שצריכים להיות זהים לסוגי הנתונים שהצהרתם לגביהם ב-Play Console.
ב-Health Connect נעשה שימוש בפורמט ההצהרה הרגיל של הרשאות ב-Android.
הקצאת הרשאות מתבצעת באמצעות התגים <uses-permission>. צריך להציב אותם בתוך התגים <manifest>.
<manifest>
<uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
<uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
<uses-permission android:name="android.permission.health.READ_STEPS"/>
<uses-permission android:name="android.permission.health.WRITE_STEPS"/>
<application>
...
</application>
</manifest>
רשימה מלאה של ההרשאות וסוגי הנתונים התואמים מופיעה במאמר רשימה של סוגי נתונים.
הצגת תיבת הדו-שיח של מדיניות הפרטיות של האפליקציה
קובץ ה-manifest של Android צריך לכלול Activity שמציג את מדיניות הפרטיות של האפליקציה. במדיניות הפרטיות צריך להסביר את ההצדקה לבקשת ההרשאות, לתאר איך הנתונים של המשתמשים משמשים ואיך מתבצע הטיפול בהם.
מצהירים על הפעילות הזו כדי לטפל ב-intent ACTION_SHOW_PERMISSIONS_RATIONALE, שמועבר לאפליקציה כשהמשתמש לוחץ על הקישור מדיניות הפרטיות במסך ההרשאות של Health Connect.
...
<application>
...
<!-- For supported versions through Android 13, create an activity to show the rationale
of Health Connect permissions once users click the privacy policy link. -->
<activity
android:name=".PermissionsRationaleActivity"
android:exported="true">
<intent-filter>
<action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
</intent-filter>
</activity>
<!-- For versions starting Android 14, create an activity alias to show the rationale
of Health Connect permissions once users click the privacy policy link. -->
<activity-alias
android:name="ViewPermissionUsageActivity"
android:exported="true"
android:targetActivity=".PermissionsRationaleActivity"
android:permission="android.permission.START_VIEW_PERMISSION_USAGE">
<intent-filter>
<action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
<category android:name="android.intent.category.HEALTH_PERMISSIONS" />
</intent-filter>
</activity-alias>
...
</application>
...
קבלת לקוח Health Connect
HealthConnectClient היא נקודת כניסה ל-Health Connect API.
היא מאפשרת לאפליקציה להשתמש במאגר הנתונים באפליקציית Health Connect. היא מנהלת באופן אוטומטי את החיבור שלה לשכבת האחסון הבסיסית ומטפלת בכל ה-IPC והסריאליזציה של בקשות יוצאות ותשובות נכנסות.
כדי לקבל מופע של לקוח, קודם צריך להצהיר על שם החבילה של Health Connect במניפסט של Android.
<application> ... </application>
...
<!-- Check if Health Connect is installed -->
<queries>
<package android:name="com.google.android.apps.healthdata" />
</queries>
לאחר מכן, בודקים בפעילות אם Health Connect מותקנת באמצעות getSdkStatus. אם כן, צריך לקבל מופע של HealthConnectClient.
val availabilityStatus = HealthConnectClient.getSdkStatus(context) if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) { Box(modifier = modifier.padding(16.dp), contentAlignment = Alignment.Center) { Text( text = "Health Connect is not available on this device. Please ensure it is installed and updated.", style = MaterialTheme.typography.bodyLarge, textAlign = TextAlign.Center ) } return } val healthConnectClient = remember { if (availabilityStatus == HealthConnectClient.SDK_AVAILABLE) { HealthConnectClient.getOrCreate(context) } else { null } }
שלב 4: מבקשים הרשאות מהמשתמש
אחרי שיוצרים מופע של לקוח, האפליקציה צריכה לבקש הרשאות מהמשתמש. צריך לאפשר למשתמשים להעניק או לדחות הרשאות בכל שלב. כדי לעשות זאת, יוצרים קבוצת הרשאות לסוגי הנתונים הנדרשים. קודם צריך לוודא שההרשאות בקבוצה מוצהרות במניפסט של Android.
val permissions = setOf( HealthPermission.getReadPermission(HeartRateRecord::class), HealthPermission.getWritePermission(HeartRateRecord::class), HealthPermission.getReadPermission(StepsRecord::class), HealthPermission.getWritePermission(StepsRecord::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.") } } }
הוספת משתמשים
להרבה אפליקציות יש תהליך מותאם אישית להצטרפות משתמשים, כמו הסבר על תכונות או בקשת הסכמה מהמשתמש. כדי לאפשר ל-Health Connect להפעיל את תהליך ההצטרפות, מוסיפים את הקוד הבא למניפסט:
<!-- Required to support pre-Android 14 devices with APK Health Connect -->
<activity
android:name=".OnboardingActivity"
android:exported="true"
android:permission="com.google.android.apps.healthdata.permission.START_ONBOARDING">
<intent-filter>
<action android:name="androidx.health.ACTION_SHOW_ONBOARDING"/>
</intent-filter>
</activity>
<!-- Required to support Android 14+ devices with platform Health Connect -->
<activity-alias
android:name="UAndAboveOnboardingActivity"
android:exported="true"
android:targetActivity=".OnboardingActivity"
android:permission="android.permission.health.START_ONBOARDING">
<intent-filter>
<action android:name="android.health.connect.action.SHOW_ONBOARDING" />
</intent-filter>
</activity-alias>
יכול להיות שהמשתמשים יתחילו את הקישור לאפליקציה שלכם ישירות מאפליקציית Health Connect, ולא מתוך האפליקציה שלכם. אם האפליקציה שלכם דורשת אינטראקציה נוספת מעבר למתן הרשאה לקרוא או לכתוב נתונים, עליכם לספק פעילות להצטרפות.
שימו לב: יכול להיות שהפעילות של תהליך ההצטרפות תופעל יותר מפעם אחת, למשל אם המשתמש יבטל בהמשך את ההרשאות לאפליקציה שלכם ואז יקשר אותה מחדש.
שלב 5: ביצוע פעולות
אחרי שסיימתם את ההגדרה, אתם יכולים לבצע פעולות קריאה וכתיבה באפליקציה.
יכול להיות שהמשתמשים שלכם משתמשים באפליקציות אחרות שמסנכרנות נתונים עם Health Connect כדי שהאפליקציה שלכם תוכל לגשת אליהם. אם המשתמש עדיין לא הגדיר את האפליקציות האלה כך שיכתבו נתונים ב-Health Connect, אפשר להשתמש ב-Matchmaking API כדי לקשר את האפליקציות האלה למשתמשים בצורה חלקה.
כתיבת נתונים
מבנה הנתונים צריך להיות בצורת רשומה. אפשר לעיין ברשימה של סוגי הנתונים שזמינים ב-Health Connect.
val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime) val stepsRecord = StepsRecord( count = 120, startTime = startTime, endTime = endTime, startZoneOffset = zoneOffset, endZoneOffset = zoneOffset, metadata = Metadata( device = Device(type = Device.TYPE_WATCH), recordingMethod = Metadata.RECORDING_METHOD_AUTOMATICALLY_RECORDED ) ) healthConnectClient.insertRecords(listOf(stepsRecord))
אחר כך כותבים את הרשומה באמצעות insertRecords.
val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime) val stepsRecord = StepsRecord( count = 120, startTime = startTime, endTime = endTime, startZoneOffset = zoneOffset, endZoneOffset = zoneOffset, metadata = Metadata( device = Device(type = Device.TYPE_WATCH), recordingMethod = Metadata.RECORDING_METHOD_AUTOMATICALLY_RECORDED ) ) healthConnectClient.insertRecords(listOf(stepsRecord))
קריאת נתונים
אפשר לקרוא את הנתונים בנפרד באמצעות readRecords.
val response = healthConnectClient.readRecords( ReadRecordsRequest( HeartRateRecord::class, timeRangeFilter = TimeRangeFilter.between(startTime, endTime) ) ) response.records.forEach { record -> /* Process records */ }
אפשר גם לקרוא את הנתונים בצורה אגרגטיבית באמצעות aggregate.
suspend fun readStepsAggregate(startTime: Instant, endTime: Instant): Long { val response = healthConnectClient.aggregate( AggregateRequest( metrics = setOf(StepsRecord.COUNT_TOTAL), timeRangeFilter = TimeRangeFilter.between(startTime, endTime) ) ) return response[StepsRecord.COUNT_TOTAL] ?: 0L }
סרטוני הדרכה
כדאי לצפות בסרטונים האלה כדי לקבל מידע נוסף על התכונות של Health Connect ועל הנחיות לשיטות מומלצות לשילוב חלק:
משאבים
בהמשך תוכלו להיעזר במקורות המידע הבאים לפיתוח.
- Health Connect SDK (זמין ב-Jetpack): צריך לכלול את ה-SDK הזה באפליקציה כדי להשתמש ב-Health Connect API.
- הפניית API: אפשר לעיין בהפניה ל-Jetpack ל-Health Connect API.
- הצהרה על השימוש בסוגי נתונים: ב-Play Console, מצהירים על הגישה לסוגי הנתונים של Health Connect שהאפליקציה קוראת מהם וכותבת אליהם.
- דוגמת קוד ב-GitHub ו-Codelab (אופציונלי): כדי להתחיל, אפשר להיעזר במאגר דוגמאות הקוד ב-GitHub ובתרגיל ה-Codelab.
השלבים הבאים
במאמר תהליכי עבודה נפוצים מוסבר איך לבצע פעולות ב-Health Connect, כמו: