פיתוח חוויות של נתונים חיוניים באמצעות Health Connect

אם אתם רוצים לפתח אפליקציה לניהול נתונים חיוניים של משתמשים, אתם יכולים להשתמש ב-Health Connect כדי לבצע פעולות כמו:

  • קריאת נתונים של סימנים חיוניים כמו לחץ דם, דופק וחום גוף מאפליקציות אחרות
  • כתיבה של נתונים חיוניים שתועדו על ידי האפליקציה או מכשירים מקושרים
  • מעקב אחר מגמות ומתן תובנות לגבי הבריאות על סמך נתונים של סימנים חיוניים

במדריך הזה מוסבר איך לעבוד עם סוגי נתונים של מדדים חיוניים. הוא כולל הסבר על הרשאות, על תהליכי עבודה של קריאה וכתיבה ועל שיטות מומלצות.

סקירה כללית: יצירת כלי מקיף למעקב אחרי מדדים חיוניים

כדי ליצור חוויית מעקב מקיפה של נתונים חיוניים באמצעות Health Connect, פועלים לפי השלבים העיקריים הבאים:

  • מבקשים את ההרשאות המתאימות לסוגי נתונים של מדדים חיוניים.
  • כתיבת נתונים של מדדים חיוניים באמצעות רשומות כמו BloodPressureRecord,‏ HeartRateRecord ורשומות אחרות של מדדים חיוניים.
  • קריאת נתונים של סימנים חיוניים לצורך הצגה, ניתוח או סנכרון.
  • שימוש באצווה לכתיבה ולקריאה יעילות של נתונים.

תהליך העבודה הזה מאפשר יכולת פעולה הדדית עם אפליקציות אחרות של Health Connect ומוודא גישה לנתונים בשליטת המשתמש.

לפני שמתחילים

לפני שמטמיעים את התכונות של סימנים חיוניים:

קונספטים מרכזיים

נתוני סימנים חיוניים ב-Health Connect מיוצגים על ידי סוגים שונים של רשומות, שכל אחת מהן מתאימה למדידה פיזיולוגית ספציפית. בניגוד לאימוני כושר, סימנים חיוניים נרשמים לרוב כנתונים שמתייחסים לנקודת זמן מסוימת או לפרק זמן מסוים.

סוגי נתונים של מדדים חיוניים

נתוני סימנים חיוניים מיוצגים על ידי סוגים נפרדים של רשומות. סוגים נפוצים:

  • BloodPressureRecord: מייצג קריאה יחידה של לחץ הדם, כולל לחץ סיסטולי ודיאסטולי ותנוחת הגוף.
  • HeartRateRecord: מייצג סדרה של מדידות דופק.
  • RestingHeartRateRecord: מייצג מדידה יחידה של קצב הלב במנוחה.
  • BodyTemperatureRecord: מייצג קריאה אחת של טמפרטורת הגוף, כולל מיקום המדידה.
  • BloodGlucoseRecord: מייצג קריאה אחת של רמת סוכר בדם, כולל הקשר לארוחה ולמקור הדגימה.
  • OxygenSaturationRecord: מייצג קריאה אחת של רמת החמצן בדם.
  • RespiratoryRateRecord: מייצג מדידה יחידה של קצב הנשימה.

רשימה מלאה של סוגי הנתונים זמינה במאמר סוגי הנתונים ב-Health Connect.

שיקולי פיתוח

נתוני המדדים החיוניים יכולים להיות רגישים, ויכול להיות שאפליקציות יצטרכו לכתוב נתונים בתגובה למדידות מחיישנים או לקלט של משתמשים, או לסנכרן נתונים מבק-אנד. הרשאות הן חיוניות לטיפול בנתוני המדדים החיוניים.

הרשאות

האפליקציה שלכם צריכה לבקש את ההרשאות הרלוונטיות ל-Health Connect לפני שהיא קוראת או כותבת נתונים של סימנים חיוניים. ההרשאות הנפוצות לסימנים חיוניים כוללות לחץ דם, דופק, חום גוף, רמת סוכר בדם, רמת החמצן בדם וקצב הנשימה. הדוגמאות הבאות ממחישות את המצב הזה:

בדוגמה הבאה אפשר לראות איך מבקשים הרשאות לגישה לנתונים של לחץ דם, דופק וטמפרטורת הגוף:

אחרי שיוצרים מופע של לקוח, האפליקציה צריכה לבקש הרשאות מהמשתמש. צריך לאפשר למשתמשים להעניק או לדחות הרשאות בכל שלב.

כדי לעשות זאת, יוצרים קבוצת הרשאות לסוגי הנתונים הנדרשים. קודם צריך לוודא שההרשאות בקבוצה מוצהרות במניפסט של Android.

// Create a set of permissions for required data types
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.

// 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)
  }
}

המשתמשים יכולים לתת או לבטל הרשאות בכל שלב, ולכן האפליקציה צריכה לבדוק אם ההרשאות ניתנו בכל פעם לפני שהיא משתמשת בהן, ולטפל במקרים שבהם הרשאה כלשהי בוטלה.

כדי לבקש הרשאות, קוראים לפונקציה checkPermissionsAndRun:

if (!granted.containsAll(PERMISSIONS)) {
    requestPermissions.launch(PERMISSIONS)
    // Check if required permissions are not granted, and return
  }
// Permissions already granted; proceed with inserting or reading data

אם אתם צריכים לבקש הרשאות רק לסוג נתונים אחד, כמו לחץ דם, אתם צריכים לכלול רק את סוג הנתונים הזה בקבוצת ההרשאות:

הגישה לנתוני לחץ הדם מוגנת על ידי ההרשאות הבאות:

  • android.permission.health.READ_BLOOD_PRESSURE
  • android.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, אתם יכולים להשתמש ב-ChangeLogs. כך אפשר לאחזר רשימה של רשומות שנוספו, עודכנו או נמחקו מאז נקודת זמן ספציפית, וזה יעיל יותר ממעקב ידני אחרי שינויים או מקריאה חוזרת של כל הנתונים. מידע נוסף זמין במאמר בנושא סנכרון נתונים עם Health Connect.

שיטות מומלצות

כדי לשפר את מהימנות הנתונים ואת חוויית המשתמש, כדאי לפעול בהתאם להנחיות הבאות:

  • תדירות כתיבה ועיבוד באצ'ים: כדי לצמצם את התקורה של קלט/פלט ולשמור על חיי הסוללה, כדאי לקבץ נקודות נתונים לקריאה אחת של insertRecords עם אצ'ים של עד 1,000 רשומות, במקום לכתוב כל נקודה בנפרד.
    • מעקב בזמן אמת: כדי לקבל עדכונים תכופים מחיישנים (כמו מוניטורים רציפים של גלוקוז או מוניטורים של קצב לב), כדאי לכתוב את הנתונים במנות במרווחי זמן של עד 15 דקות, כדי לאזן בין עדכונים בזמן אמת לבין יעילות הסוללה.
    • סנכרון ברקע: אפשר להשתמש ב-WorkManager לכתיבה מושהית, למשל לסנכרון נתונים ממכשיר משלים או משירות קצה עורפי. כדאי לכוון למרווח של 15 דקות לכתיבות באצווה.
  • הימנעות מכתיבת נתונים כפולים: שימוש במזהי לקוח כשיוצרים רשומות, צריך להגדיר metadata.clientRecordId. הוא משמש את Health Connect לזיהוי רשומות ייחודיות. אם תנסו לכתוב רשומה עם clientRecordId שכבר קיים, מערכת Health Connect תתעלם מהכפילות או תעדכן את הרשומה הקיימת במקום ליצור רשומה חדשה. ההגדרה של metadata.clientRecordId היא הדרך היעילה ביותר למנוע כפילויות במהלך ניסיונות חוזרים של סנכרון או התקנה מחדש של האפליקציה.

    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,
        metadata = Metadata(
            // Use a unique ID from your own database
            clientRecordId = "bp_20240101_user123"
        )
    )
  • בדיקת נתונים קיימים: לפני סנכרון הנתונים, כדאי לשלוח שאילתה ל-Health Connect לגבי רשומות בטווח הזמן של הסנכרון כדי לבדוק אם כבר קיימים נתונים מהאפליקציה, וכך להימנע מכפילויות או מהחלפת נתונים חדשים יותר.

  • הסבר ברור למה נדרשת הרשאה: צריך להשתמש בתהליך Permission.createIntent כדי להסביר למה האפליקציה צריכה גישה לנתונים רפואיים, למשל: "כדי לעקוב אחרי מגמות לחץ הדם ולספק תובנות".

  • התאמת חותמות הזמן למדידות: צריך לוודא שחותמות הזמן של הרשומות משקפות בצורה מדויקת את הזמן שבו בוצעו המדידות. לנתוני מרווחים כמו HeartRateRecord, מוודאים ש-startTime ו-endTime נכונים.

בדיקה

כדי לוודא שהנתונים נכונים ושהמשתמשים נהנים מחוויה איכותית, כדאי לפעול לפי אסטרטגיות הבדיקה האלה ולעיין במסמכי התיעוד הרשמיים בנושא בדיקת תרחישי שימוש מרכזיים.

כלי אימות

  • ארגז הכלים של Health Connect: אפשר להשתמש באפליקציה הנלווית הזו כדי לבדוק רשומות באופן ידני, למחוק נתוני בדיקה ולדמות שינויים במסד הנתונים. זו הדרך הכי טובה לוודא שהרשומות שלכם מאוחסנות בצורה נכונה.
  • בדיקות יחידה באמצעות FakeHealthConnectClient: אפשר להשתמש בספריית הבדיקות כדי לבדוק איך האפליקציה מטפלת במקרים קיצוניים, כמו ביטול הרשאה או חריגות ב-API, בלי צורך במכשיר פיזי.

רשימת משימות לבדיקת איכות

ארכיטקטורה אופיינית

הטמעה של מדדים חיוניים בדרך כלל כוללת:

רכיב מנהל/ת
בקר סימנים חיוניים קריאת חיישן/קלט
לוגיקה של אצווה
שכבת מאגר (עוטפת פעולות של Health Connect): הוספת רשומות של מדדים חיוניים
קריאת רשומות של מדדים חיוניים
שכבת ממשק המשתמש (מסכים): קריאות בזמן אמת
נתונים היסטוריים
תרשימים ומגמות

פתרון בעיות

תיאור הבעיה סיבה אפשרית רזולוציה
סוגי נתונים חסרים (לדוגמה, לחץ דם) הרשאות הכתיבה חסרות או שהמסננים של הזמן שגויים. בודקים שביקשתם מהמשתמש הרשאה לסוג הנתונים הספציפי והמשתמש אישר את הבקשה. מוודאים שReadRecordsRequest משתמש בTimeRangeFilter שתקף לזמן המדידה. מידע נוסף על הרשאות
הכתיבה של הרשומות נכשלת יחידות שגויות או ערכים מחוץ לטווח התקין. ‫Health Connect מאמת את ערכי הרשומות. לדוגמה, ערכי לחץ הדם צריכים להיות בטווח פיזיולוגי סביר. במסמכי התיעוד של סוג הנתונים אפשר למצוא מידע על טווחים ויחידות תקינים.
מופיעות רשומות כפולות חסר: clientRecordId להקצות clientRecordId ייחודי בMetadata של כל רשומה. כך, אם אותם נתונים נכתבים פעמיים במהלך ניסיון חוזר של סנכרון, אפליקציית Health Connect יכולה לבצע הסרת כפילויות. שיטות מומלצות

שלבים נפוצים לניפוי באגים

  • בדיקת מצב ההרשאה: תמיד צריך להתקשר אל getPermissionStatus() לפני שמנסים לבצע פעולת קריאה או כתיבה. המשתמשים יכולים לבטל את ההרשאות בהגדרות המערכת בכל שלב.