אם אתם רוצים לפתח אפליקציה לניהול נתונים חיוניים של משתמשים, אתם יכולים להשתמש ב-Health Connect כדי לבצע פעולות כמו:
- קריאת נתונים של סימנים חיוניים כמו לחץ דם, דופק וחום גוף מאפליקציות אחרות
- כתיבה של נתונים חיוניים שתועדו על ידי האפליקציה או מכשירים מקושרים
- מעקב אחר מגמות ומתן תובנות לגבי הבריאות על סמך נתונים של סימנים חיוניים
במדריך הזה מוסבר איך לעבוד עם סוגי נתונים של מדדים חיוניים. המדריך כולל הסברים על הרשאות, על תהליכי עבודה של קריאה וכתיבה ועל שיטות מומלצות.
סקירה כללית: יצירת כלי מקיף למעקב אחרי מדדי תפקוד האפליקציה
כדי ליצור חוויית מעקב מקיפה אחר נתונים חיוניים באמצעות Health Connect, צריך לבצע את השלבים הבסיסיים הבאים:
- בקשת ההרשאות המתאימות לסוגי נתונים של מדדים חיוניים.
- כתיבת נתונים של מדדים חיוניים באמצעות רשומות כמו
BloodPressureRecord,HeartRateRecordורשומות אחרות של מדדים חיוניים. - קריאת נתונים של סימנים חיוניים לצורך הצגה, ניתוח או סנכרון.
- שימוש באצווה לכתיבה ולקריאה יעילות של נתונים.
תהליך העבודה הזה מאפשר אינטראופרביליות עם אפליקציות אחרות של Health Connect ומאמת את הגישה לנתונים שנשלטת על ידי המשתמש.
לפני שמתחילים
לפני שמטמיעים את התכונות של מדדי החיוניות:
- משלבים את Health Connect באמצעות התלות המתאימה.
- יוצרים מכונת
HealthConnectClient. - מוודאים שהאפליקציה מטמיעה זרימות הרשאות בזמן ריצה על סמך הרשאות גישה לנתוני בריאות.
מושגים מרכזיים
נתוני סימנים חיוניים ב-Health Connect מיוצגים על ידי סוגים שונים של רשומות, שכל אחת מהן מתאימה למדידה פיזיולוגית ספציפית. בניגוד לאימונים, נתוני חיוניות נרשמים לרוב כנתונים שמתייחסים לנקודת זמן מסוימת או לפרק זמן מסוים.
סוגי נתונים של מדדים חיוניים
נתוני סימנים חיוניים מיוצגים על ידי סוגים נפרדים של רשומות. דוגמאות לסוגים נפוצים:
-
BloodPressureRecord: מייצג קריאה יחידה של לחץ הדם, כולל לחץ סיסטולי ודיאסטולי ותנוחת הגוף. -
HeartRateRecord: מייצג סדרה של מדידות דופק. -
RestingHeartRateRecord: מייצג מדידה יחידה של קצב הלב במנוחה. -
BodyTemperatureRecord: מייצג קריאה אחת של טמפרטורת הגוף, כולל מיקום המדידה. -
BloodGlucoseRecord: מייצג קריאה אחת של רמת סוכר בדם, כולל הקשר לארוחה ולמקור הדגימה. -
OxygenSaturationRecord: מייצג קריאה אחת של רמת החמצן בדם. -
RespiratoryRateRecord: מייצג מדידה אחת של קצב הנשימה.
רשימה מלאה של סוגי הנתונים זמינה במאמר סוגי נתונים ב-Health Connect.
שיקולי פיתוח
נתונים של סימנים חיוניים יכולים להיות רגישים, ואפליקציות עשויות להזדקק להרשאות כדי לכתוב נתונים בתגובה למדידות מחיישנים או לקלט של משתמשים, או כדי לסנכרן נתונים מהבק-אנד. הרשאות חיוניות לטיפול בנתונים של סימנים חיוניים.
הרשאות
האפליקציה צריכה לבקש את ההרשאות הרלוונטיות ל-Health Connect לפני שהיא קוראת או כותבת נתונים של סימנים חיוניים. הרשאות נפוצות לסימנים חיוניים כוללות לחץ דם, דופק, חום גוף, סוכר בדם, רמת החמצן בדם וקצב הנשימה. הדוגמאות הבאות ממחישות את המצב הזה:
- לחץ דם: הרשאות קריאה וכתיבה ל-
BloodPressureRecord. - דופק: הרשאות קריאה וכתיבה ל-
HeartRateRecord. - דופק במנוחה: הרשאות קריאה וכתיבה ל-
RestingHeartRateRecord. - טמפרטורת הגוף: הרשאות קריאה וכתיבה ל-
BodyTemperatureRecord. - רמת הסוכר בדם: הרשאות קריאה וכתיבה עבור
BloodGlucoseRecord. - רמת החמצן בדם: הרשאות קריאה וכתיבה ל-
OxygenSaturationRecord. - קצב נשימה: הרשאות קריאה וכתיבה ל-
RespiratoryRateRecord.
בדוגמה הבאה אפשר לראות איך מבקשים הרשאות לגישה לנתונים של לחץ דם, דופק וטמפרטורת גוף:
אחרי שיוצרים מופע של לקוח, האפליקציה צריכה לבקש הרשאות מהמשתמש. צריך לאפשר למשתמשים להעניק או לדחות הרשאות בכל שלב. כדי לעשות זאת, יוצרים קבוצת הרשאות לסוגי הנתונים הנדרשים. קודם צריך לוודא שההרשאות בקבוצה מוצהרות במניפסט של Android.
val permissions = setOf( HealthPermission.getReadPermission(BloodPressureRecord::class), HealthPermission.getWritePermission(BloodPressureRecord::class), HealthPermission.getReadPermission(HeartRateRecord::class), HealthPermission.getWritePermission(HeartRateRecord::class), HealthPermission.getReadPermission(BodyTemperatureRecord::class), HealthPermission.getWritePermission(BodyTemperatureRecord::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.") } } }
כדי לבקש הרשאות, קוראים לפונקציה checkPermissionsAndRun:
if (!granted.containsAll(permissions)) { // Check if required permissions are not granted, and return return emptySet() } // Permissions already granted; proceed with inserting or reading data
אם אתם צריכים לבקש הרשאות רק לסוג נתונים אחד, כמו לחץ דם, אתם צריכים לכלול רק את סוג הנתונים הזה בקבוצת ההרשאות:
הגישה לנתוני לחץ הדם מוגנת על ידי ההרשאות הבאות:
android.permission.health.READ_BLOOD_PRESSUREandroid.permission.health.WRITE_BLOOD_PRESSURE
כדי להוסיף לאפליקציה אפשרות של מדידת לחץ דם, צריך קודם לבקש הרשאות לסוג הנתונים BloodPressureRecord.
זו ההרשאה שצריך להצהיר עליה כדי שיהיה אפשר לכתוב לחץ דם:
<application>
<uses-permission
android:name="android.permission.health.WRITE_BLOOD_PRESSURE" />
...
</application>
כדי לקרוא את לחץ הדם, צריך לבקש את ההרשאות הבאות:
<application>
<uses-permission
android:name="android.permission.health.READ_BLOOD_PRESSURE" />
...
</application>
כתיבת נתונים של מדדים חיוניים
בקטע הזה מוסבר איך לכתוב נתונים של סימנים חיוניים ב-Health Connect. נתוני Vitals נכתבים בדרך כלל כרשומות נפרדות. אם אתם כותבים כמה רשומות בבת אחת, למשל כשמסנכרנים מחיישן או מקצה עורפי, כדאי להשתמש באפשרות של עיבוד באצווה.
דוגמה לכתיבת BloodPressureRecord:
suspend fun writeBloodPressureRecord(healthConnectClient: HealthConnectClient) { val record = BloodPressureRecord( time = Instant.now(), zoneOffset = ZoneOffset.UTC, systolic = Pressure.millimetersOfMercury(120.0), diastolic = Pressure.millimetersOfMercury(80.0), bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN, measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST ) healthConnectClient.insertRecords(listOf(record)) }
כתיבה באצווה
אם האפליקציה צריכה לכתוב כמה נקודות נתונים, למשל לסנכרן נתונים ממכשיר מחובר או משירות קצה עורפי, כדאי לכתוב את הנתונים בקבוצות כדי לשפר את היעילות ולהפחית את צריכת הסוללה. Health Connect יכולה לטפל בעד 1,000 רשומות בבקשת כתיבה אחת.
בדוגמה הבאה אפשר לראות איך לכתוב כמה רשומות בבת אחת:
suspend fun writeBatchRecords(healthConnectClient: HealthConnectClient) { val bloodPressureRecord = BloodPressureRecord( time = Instant.now(), zoneOffset = ZoneOffset.UTC, systolic = Pressure.millimetersOfMercury(120.0), diastolic = Pressure.millimetersOfMercury(80.0), bodyPosition = BloodPressureRecord.BODY_POSITION_SITTING_DOWN, measurementLocation = BloodPressureRecord.MEASUREMENT_LOCATION_LEFT_WRIST ) val heartRateRecord = HeartRateRecord( startTime = Instant.now().minusSeconds(60), startZoneOffset = ZoneOffset.UTC, endTime = Instant.now(), endZoneOffset = ZoneOffset.UTC, samples = listOf(HeartRateRecord.Sample(time = Instant.now().minusSeconds(30), beatsPerMinute = 80)) ) healthConnectClient.insertRecords(listOf(bloodPressureRecord, heartRateRecord)) }
קריאת נתונים של מדדים חיוניים
אפליקציות יכולות לקרוא נתונים של סימנים חיוניים כדי להציג מדידות, לנתח מגמות או לסנכרן נתונים עם שרת חיצוני. כדי לקרוא נתונים חיוניים, משתמשים ב-ReadRecordsRequest עם סוג הרשומה הספציפי ומסננים לפי טווח זמן.
דוגמה לקריאת נתוני BloodPressureRecord:
suspend fun readBloodPressureRecords( healthConnectClient: HealthConnectClient, startTime: Instant, endTime: Instant ) { val response = healthConnectClient.readRecords( ReadRecordsRequest( recordType = BloodPressureRecord::class, timeRangeFilter = TimeRangeFilter.between(startTime, endTime) ) ) for (record in response.records) { // Process each blood pressure record val systolic = record.systolic val diastolic = record.diastolic } }
אם אתם צריכים לסנכרן נתונים של סימנים חיוניים עם שרת עורפי, או לעדכן את מאגר הנתונים של האפליקציה שלכם ב-Health Connect, אתם יכולים להשתמש ביומני שינויים. כך תוכלו לאחזר רשימה של רשומות שנוספו, עודכנו או נמחקו מאז נקודת זמן מסוימת. זה יעיל יותר ממעקב ידני אחרי שינויים או מקריאה חוזרת של כל הנתונים. למידע נוסף, אפשר לעיין במאמר בנושא סנכרון נתונים עם Health Connect.
שיטות מומלצות
כדי לשפר את מהימנות הנתונים ואת חוויית המשתמש, כדאי לפעול לפי ההנחיות הבאות:
- בקשות כתיבה באצווה: כדי לצמצם את התקורה של קלט/פלט ולשמור על חיי הסוללה, כדאי לקבץ נקודות נתונים לקריאה יחידה של
insertRecordsעם אצוות של עד 1,000 רשומות, במקום לכתוב כל נקודה בנפרד. - כתיבה בתדירות גבוהה במהלך מעקב בזמן אמת: כדי לקבל עדכונים תכופים מחיישנים (כמו מכשירי ניטור רציף של רמת הגלוקוז או מכשירי ניטור קצב הלב), כדאי לכתוב את הנתונים במנות במרווחי זמן של עד 15 דקות, כדי לאזן בין עדכונים בזמן אמת לבין יעילות הסוללה.
- שימוש ב-WorkManager לסנכרון ברקע: כדאי להשתמש ב-
WorkManagerלכתיבות שנדחות, כמו סנכרון נתונים ממכשיר משלים או משירות קצה עורפי. מומלץ להשתמש במרווח של 15 דקות לכתיבות באצווה. - כדי למנוע כתיבה של נתונים כפולים: משתמשים במזהי לקוח: כשיוצרים רשומות, מגדירים
metadata.clientRecordId. מערכת Health Connect משתמשת במזהה הזה כדי לזהות רשומות ייחודיות. אם מנסים לכתוב רשומה עםclientRecordIdשכבר קיים, מערכת Health Connect מתעלמת מהכפילות או מעדכנת את הרשומה הקיימת במקום ליצור רשומה חדשה. הגדרתmetadata.clientRecordIdהיא הדרך היעילה ביותר למנוע כפילויות במהלך ניסיונות חוזרים לסנכרון או התקנה מחדש של אפליקציה.val record = StepsRecord( count = 100, startTime = startTime, endTime = endTime, startZoneOffset = ZoneOffset.UTC, endZoneOffset = ZoneOffset.UTC, metadata = Metadata( // Use a unique ID from your own database clientRecordId = "daily_steps_2023_10_27_user_123" ) )
- בדיקת נתונים קיימים: לפני שמסנכרנים נתונים, כדאי לשלוח שאילתה ל-Health Connect לגבי רשומות בטווח הזמן של הסנכרון כדי לראות אם כבר קיימים נתונים מהאפליקציה, וכך להימנע מכפילויות או מהחלפה של נתונים חדשים יותר.
- לספק נימוקים ברורים להרשאה: צריך להשתמש בתהליך
Permission.createIntentכדי להסביר למה האפליקציה צריכה גישה לנתונים בתחום הבריאות. לדוגמה: 'כדי לעקוב אחרי המגמות של לחץ הדם ולספק תובנות'. - התאמה בין חותמות הזמן לבין המדידות: צריך לוודא שחותמות הזמן של הרשומות משקפות בצורה מדויקת את הזמן שבו בוצעו המדידות. כשמדובר בנתונים של מרווחי זמן כמו
HeartRateRecord, צריך לוודא שהערכים שלstartTimeו-endTimeנכונים.
בדיקה
כדי לוודא שהנתונים נכונים ושהמשתמשים נהנים מחוויה איכותית, כדאי לפעול לפי אסטרטגיות הבדיקה האלה ולעיין במסמכי התיעוד הרשמיים בנושא בדיקת תרחישי שימוש נפוצים.
כלי אימות
- ארגז הכלים של Health Connect: אפשר להשתמש באפליקציה הנלווית הזו כדי לבדוק רשומות באופן ידני, למחוק נתוני בדיקה ולבצע סימולציה של שינויים במסד הנתונים. זו הדרך הכי טובה לוודא שהרשומות שלכם מאוחסנות בצורה נכונה.
- בדיקות יחידה באמצעות
FakeHealthConnectClient: אפשר להשתמש בספריית הבדיקות כדי לוודא איך האפליקציה מטפלת במקרים קיצוניים, כמו ביטול הרשאה או חריגות ב-API, בלי צורך במכשיר פיזי.
רשימת משימות לבדיקת איכות
ארכיטקטורה אופיינית
הטמעה של מדדים חיוניים כוללת בדרך כלל:
| רכיב | מנהל |
|---|---|
| הכלי 'סימנים חיוניים' | קריאת חיישן/קלט לוגיקה של אצווה |
| שכבת מאגר (עוטפת את הפעולות של Health Connect): | הוספת רשומות של מדדים חיוניים קריאת רשומות של מדדים חיוניים |
| שכבת ממשק המשתמש (מסכים): | קריאות בזמן אמת נתונים היסטוריים תרשימים ומגמות |
פתרון בעיות
| תיאור הבעיה | גורם אפשרי | רזולוציה |
|---|---|---|
| סוגי נתונים חסרים (לדוגמה, לחץ דם) | הרשאות הכתיבה חסרות או שהמסננים של הזמן שגויים. | בודקים שביקשתם מהמשתמש הרשאה לסוג הנתונים הספציפי והמשתמש אישר את הבקשה. מוודאים שReadRecordsRequest משתמש בTimeRangeFilter שתקף לזמן המדידה. מידע נוסף על הרשאות |
| מופיעות רשומות כפולות | חסר: clientRecordId |
צריך להקצות clientRecordId ייחודי ב-Metadata של כל רשומה. כך, אם אותם נתונים נכתבים פעמיים במהלך ניסיון חוזר לסנכרון, Health Connect יכול לבצע ביטול כפילויות. אפשר לעיין בשיטות מומלצות. |
| הכתיבה של הרשומות נכשלת | יחידות שגויות או ערכים מחוץ לטווח התקין. | Health Connect מאמת את ערכי הרשומות. לדוגמה, ערכי לחץ הדם צריכים להיות בטווח פיזיולוגי סביר. כדאי לעיין בתיעוד של סוג הנתונים כדי לראות את הטווחים והיחידות התקינים. |
שלבים נפוצים לניפוי באגים
| בודקים את מצב ההרשאה. | תמיד צריך להתקשר אל getPermissionStatus() לפני שמנסים לבצע פעולת קריאה או כתיבה. המשתמשים יכולים לבטל את ההרשאות בהגדרות המערכת בכל שלב. |