Health Connect की मदद से, वाइटल्स से जुड़े अनुभव डेवलप करना

अगर आपको ऐसा ऐप्लिकेशन बनाना है जो लोगों की सेहत से जुड़े डेटा को मैनेज करता है, तो Health Connect का इस्तेमाल करके ये काम किए जा सकते हैं:

  • अन्य ऐप्लिकेशन से, सेहत से जुड़ा डेटा पढ़ना. जैसे, ब्लड प्रेशर, धड़कन की दर, और शरीर का तापमान
  • आपके ऐप्लिकेशन या कनेक्ट किए गए डिवाइसों से रिकॉर्ड किए गए, सेहत से जुड़े डेटा को सेव करना
  • सेहत से जुड़े डेटा के आधार पर, रुझानों की निगरानी करना और सेहत से जुड़ी अहम जानकारी देना

इस गाइड में, सेहत से जुड़े डेटा टाइप के साथ काम करने का तरीका बताया गया है. इसमें अनुमतियां, डेटा पढ़ने और सेव करने के वर्कफ़्लो, और सबसे सही तरीकों के बारे में जानकारी दी गई है.

खास जानकारी: सेहत से जुड़े डेटा को ट्रैक करने वाला एक ऐसा ऐप्लिकेशन बनाना जो सभी तरह का डेटा ट्रैक कर सके

Health Connect का इस्तेमाल करके, सेहत से जुड़े डेटा को ट्रैक करने वाला एक ऐसा ऐप्लिकेशन बनाया जा सकता है जो सभी तरह का डेटा ट्रैक कर सके. इसके लिए, ये मुख्य चरण पूरे करें:

  • सेहत से जुड़े डेटा टाइप के लिए, सही अनुमतियों का अनुरोध करना.
  • BloodPressureRecord, HeartRateRecord और बीपी, धड़कन की दर वगैरह से जुड़े अन्य रिकॉर्ड जैसे रिकॉर्ड का इस्तेमाल करके, बीपी, धड़कन की दर वगैरह से जुड़ा डेटा सेव करना.
  • सेहत से जुड़े डेटा को दिखाने, उसका विश्लेषण करने या सिंक करने के लिए, उसे पढ़ना.
  • डेटा को सेव करने और पढ़ने के लिए, बैचिंग का इस्तेमाल करना.

इस वर्कफ़्लो से, Health Connect के अन्य ऐप्लिकेशन के साथ इंटरऑपरेबिलिटी मिलती है. साथ ही, यह पुष्टि होती है कि उपयोगकर्ता के पास डेटा का ऐक्सेस करने का कंट्रोल है.

शुरू करने से पहले

सेहत से जुड़ी सुविधाओं को लागू करने से पहले:

मुख्य सिद्धांत

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_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 में सेहत से जुड़ा डेटा सेव करने का तरीका बताया गया है. सेहत से जुड़े डेटा को आम तौर पर, अलग-अलग रिकॉर्ड के तौर पर सेव किया जाता है. अगर आपको एक साथ कई रिकॉर्ड सेव करने हैं, जैसे कि सेंसर या बैकएंड से सिंक करना, तो बैचिंग का इस्तेमाल करें.

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 का इस्तेमाल करना: बाद में डेटा सेव करने के लिए, 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 के साथ यूनिट टेस्टिंग: टेस्टिंग लाइब्रेरी का इस्तेमाल करके, यह पुष्टि करें कि आपका ऐप्लिकेशन, मुश्किल मामलों को कैसे मैनेज करता है. जैसे, अनुमति वापस लेना या एपीआई से जुड़ी गड़बड़ियां. इसके लिए, किसी फ़िज़िकल डिवाइस की ज़रूरत नहीं होती.

क्वालिटी की जांच सूची

आम तौर पर इस्तेमाल होने वाला आर्किटेक्चर

सेहत से जुड़े डेटा को लागू करने में आम तौर पर ये शामिल होते हैं:

कॉम्पोनेंट मैनेज करता है
सेहत से जुड़े डेटा को कंट्रोल करने वाला कॉम्पोनेंट सेंसर/इनपुट रीडिंग
बैचिंग लॉजिक
रिपॉज़िटरी लेयर (Health Connect के ऑपरेशन रैप करती है:) सेहत से जुड़े डेटा के रिकॉर्ड जोड़ना
सेहत से जुड़े डेटा के रिकॉर्ड पढ़ना
यूज़र इंटरफ़ेस (यूआई) लेयर (दिखाता है): लाइव रीडिंग
पुराना डेटा
चार्ट और रुझान

समस्या का हल

समस्या का ब्यौरा संभावित कारण रिज़ॉल्यूशन
डेटा टाइप मौजूद नहीं हैं (उदाहरण के लिए, ब्लड प्रेशर) सेव करने की अनुमतियां मौजूद नहीं हैं या समय के फ़िल्टर सही नहीं हैं. देखें कि आपने उस डेटा टाइप की अनुमति का अनुरोध किया है या नहीं और उपयोगकर्ता ने वह अनुमति दी है या नहीं. पुष्टि करें कि आपके ReadRecordsRequest में, TimeRangeFilter का इस्तेमाल किया गया है. इसमें, मेज़रमेंट का समय शामिल होना चाहिए. अनुमतियां देखें.
डुप्लीकेट रिकॉर्ड दिखते हैं clientRecordId मौजूद नहीं है. हर रिकॉर्ड के Metadata में, एक यूनीक clientRecordId असाइन करें. इससे, Health Connect को डुप्लीकेट रिकॉर्ड हटाने में मदद मिलती है. ऐसा तब होता है, जब सिंक करने की कोशिश के दौरान, एक ही डेटा को दो बार सेव किया जाता है. सबसे सही तरीके देखें.
रिकॉर्ड सेव नहीं हो पाते यूनिट या वैल्यू सही नहीं हैं या वे मान्य सीमा से बाहर हैं. Health Connect, रिकॉर्ड की वैल्यू की पुष्टि करता है. उदाहरण के लिए, रक्तचाप की वैल्यू, शरीर के हिसाब से मान्य सीमा में होनी चाहिए. मान्य सीमाओं और यूनिट के लिए, डेटा टाइप का दस्तावेज़ देखें.

डीबग करने के आम चरण

अनुमति की स्थिति देखें. डेटा पढ़ने या सेव करने की कोशिश करने से पहले, हमेशा getPermissionStatus() को कॉल करें. उपयोगकर्ता, सिस्टम की सेटिंग में जाकर किसी भी समय अनुमतियां वापस ले सकते हैं.