ביצוע מדידות של תקינות ספוט באמצעות MeasureClient

באמצעות ה-API‏ MeasureClient, האפליקציה רושמת קריאות חוזרות (callback) כדי לקבל נתונים למשך זמן קצר. השיטה הזו מיועדת למצבים שבהם האפליקציה נמצאת בשימוש ונדרשים עדכוני נתונים מהירים. אם אפשר, כדאי ליצור את זה עם ממשק משתמש בחזית כדי שהמשתמש יהיה מודע לכך.

הוספת יחסי תלות

כדי להוסיף תלות ב-Health Services, צריך להוסיף את מאגר Google Maven לפרויקט. מידע נוסף זמין במאמר בנושא מאגר Maven של Google.

לאחר מכן, בקובץ build.gradle ברמת המודול, מוסיפים את התלות הבאה:

Groovy

dependencies {
    implementation "androidx.health:health-services-client:1.1.0-alpha05"
}

Kotlin

dependencies {
    implementation("androidx.health:health-services-client:1.1.0-alpha05")
}

בדיקת היכולות

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

בדוגמה הבאה מוצג איך בודקים אם מכשיר יכול לספק את סוג הנתונים HEART_RATE_BPM:

val healthClient = HealthServices.getClient(this /*context*/)
val measureClient = healthClient.measureClient
lifecycleScope.launch {
    val capabilities = measureClient.getCapabilitiesAsync().await()
    supportsHeartRate = DataType.HEART_RATE_BPM in capabilities.supportedDataTypesMeasure
}

הרשמה לנתונים

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

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

בדוגמה הבאה מוצגות הפעולות שצריך לבצע כדי לרשום פונקציית קריאה חוזרת (callback) ולבטל את הרישום שלה כדי לקבל נתונים של HEART_RATE_BPM:

val heartRateCallback = object : MeasureCallback {
    override fun onAvailabilityChanged(dataType: DeltaDataType<*, *>, availability: Availability) {
        if (availability is DataTypeAvailability) {
            // Handle availability change.
        }
    }

    override fun onDataReceived(data: DataPointContainer) {
        // Inspect data points.
    }
}
val healthClient = HealthServices.getClient(this /*context*/)
val measureClient = healthClient.measureClient

// Register the callback.
measureClient.registerMeasureCallback(DataType.Companion.HEART_RATE_BPM, heartRateCallback)

// Unregister the callback.
awaitClose {
    runBlocking {
        measureClient.unregisterMeasureCallbackAsync(DataType.Companion.HEART_RATE_BPM, heartRateCallback)
    }
}