डेटा सेव करने की अनुमति दें

यह गाइड, Health Connect के 1.1.0-alpha12 वर्शन के साथ काम करती है.

इस गाइड में, Health Connect में डेटा सेव करने या अपडेट करने की प्रोसेस के बारे में बताया गया है.

शून्य वैल्यू मैनेज करना

ऐसा हो सकता है कि कदमों, दूरी या कैलोरी जैसे कुछ डेटा टाइप की वैल्यू 0 हो. सिर्फ़ तब शून्य वैल्यू लिखें, जब उपयोगकर्ता ने डिवाइस पहना हो और वह वाकई में कोई गतिविधि न कर रहा हो. अगर डिवाइस को पहना नहीं गया है, डेटा मौजूद नहीं है या बैटरी खत्म हो गई है, तो शून्य वैल्यू न लिखें. ऐसे मामलों में, रिकॉर्ड को शामिल न करें, ताकि गलत डेटा से बचा जा सके.

डेटा स्ट्रक्चर सेट अप करना

डेटा लिखने से पहले, हमें रिकॉर्ड सेट अप करने होंगे. 50 से ज़्यादा डेटा टाइप के लिए, हर डेटा टाइप का अपना स्ट्रक्चर होता है. उपलब्ध डेटा टाइप के बारे में ज़्यादा जानने के लिए, Jetpack का रेफ़रंस देखें.

बुनियादी रिकॉर्ड

Health Connect में कदम डेटा टाइप, यह जानकारी कैप्चर करता है कि किसी व्यक्ति ने दो रीडिंग के बीच कितने कदम चले. कदमों की संख्या, सेहत, फ़िटनेस, और वेलनेस प्लैटफ़ॉर्म पर एक सामान्य मेज़रमेंट होता है.

यहां दिए गए उदाहरण में, कदमों की संख्या का डेटा सेट करने का तरीका बताया गया है:

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(15))

val stepsRecord = StepsRecord(
    count = 120,
    startTime = startTime,
    endTime = endTime,
    startZoneOffset = ZoneOffset.UTC,
    endZoneOffset = ZoneOffset.UTC,
    metadata = Metadata.autoRecorded(
        device = Device(type = Device.TYPE_WATCH)
    )
)

माप की इकाइयों वाले रिकॉर्ड

Health Connect, वैल्यू को माप की इकाइयों के साथ सेव कर सकता है, ताकि सटीक जानकारी दी जा सके. इसका एक उदाहरण, पोषण डेटा टाइप है, जो बहुत बड़ा और व्यापक है. इसमें पोषक तत्वों के कई फ़ील्ड शामिल होते हैं. इनमें कुल कार्बोहाइड्रेट से लेकर विटामिन तक शामिल हैं. हर डेटा पॉइंट, पोषक तत्वों को दिखाता है. ये पोषक तत्व, किसी खाने की चीज़ या भोजन के हिस्से के तौर पर लिए गए हो सकते हैं.

इस डेटा टाइप में, सभी पोषक तत्वों को Mass की इकाइयों में दिखाया जाता है. वहीं, energy को Energy की इकाई में दिखाया जाता है.

यहां दिए गए उदाहरण में, केला खाने वाले व्यक्ति के लिए पोषण का डेटा सेट करने का तरीका बताया गया है:

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(1))

val banana = NutritionRecord(
    name = "banana",
    energy = 105.0.kilocalories,
    dietaryFiber = 3.1.grams,
    potassium = 0.422.grams,
    totalCarbohydrate = 27.0.grams,
    totalFat = 0.4.grams,
    saturatedFat = 0.1.grams,
    sodium = 0.001.grams,
    sugar = 14.0.grams,
    vitaminB6 = 0.0005.grams,
    vitaminC = 0.0103.grams,
    startTime = startTime,
    endTime = endTime,
    startZoneOffset = ZoneOffset.UTC,
    endZoneOffset = ZoneOffset.UTC,
    metadata = Metadata.manualEntry(
        device = Device(type = Device.TYPE_PHONE)
    )
)

सीरीज़ के डेटा वाले रिकॉर्ड

Health Connect, सीरीज़ डेटा की सूची सेव कर सकता है. इसका एक उदाहरण, धड़कन की दर डेटा टाइप है. यह धड़कन के सैंपल की एक सीरीज़ को कैप्चर करता है. इन सैंपल का पता, रीडिंग के बीच लगाया जाता है.

इस डेटा टाइप में, पैरामीटर samples को हार्ट रेट के सैंपल की सूची के तौर पर दिखाया जाता है. हर सैंपल में एक beatsPerMinute वैल्यू और एक time वैल्यू होती है.

यहां दिए गए उदाहरण में, हार्ट रेट सीरीज़ का डेटा सेट करने का तरीका बताया गया है:

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(5))

val heartRateRecord = HeartRateRecord(
    startTime = startTime,
    startZoneOffset = ZoneOffset.UTC,
    endTime = endTime,
    endZoneOffset = ZoneOffset.UTC,
    // records 10 arbitrary data, to replace with actual data
    samples = List(10) { index ->
        HeartRateRecord.Sample(
            time = startTime + Duration.ofSeconds(index.toLong()),
            beatsPerMinute = 100 + index.toLong(),
        )
    },
    metadata = Metadata.autoRecorded(
        device = Device(type = Device.TYPE_WATCH)
    ))

उपयोगकर्ता से अनुमतियों का अनुरोध करना

क्लाइंट इंस्टेंस बनाने के बाद, आपके ऐप्लिकेशन को उपयोगकर्ता से अनुमतियों का अनुरोध करना होगा. उपयोगकर्ताओं को किसी भी समय अनुमतियां देने या अस्वीकार करने की अनुमति होनी चाहिए.

इसके लिए, ज़रूरी डेटा टाइप के लिए अनुमतियों का सेट बनाएं. पक्का करें कि सेट में मौजूद अनुमतियों का एलान, सबसे पहले आपके Android मेनिफ़ेस्ट में किया गया हो.

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(HeartRateRecord::class),
  HealthPermission.getWritePermission(HeartRateRecord::class),
  HealthPermission.getReadPermission(StepsRecord::class),
  HealthPermission.getWritePermission(StepsRecord::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)
  }
}

उपयोगकर्ता किसी भी समय अनुमतियां दे या रद्द कर सकते हैं. इसलिए, आपके ऐप्लिकेशन को समय-समय पर यह जांच करनी चाहिए कि कौनसी अनुमतियां दी गई हैं. साथ ही, उन स्थितियों को मैनेज करना चाहिए जिनमें अनुमति नहीं दी गई है.

डेटा सेव करने की अनुमति दें

Health Connect में, डेटा सेव करना एक सामान्य वर्कफ़्लो है. रिकॉर्ड जोड़ने के लिए, insertRecords का इस्तेमाल करें.

यहां दिए गए उदाहरण में, कदम की संख्या डालने का तरीका बताया गया है:

suspend fun insertSteps(healthConnectClient: HealthConnectClient) {
    val endTime = Instant.now()
    val startTime = endTime.minus(Duration.ofMinutes(5))
    try {
        val stepsRecord = StepsRecord(
            count = 120,
            startTime = startTime,
            endTime = endTime,
            startZoneOffset = ZoneOffset.UTC,
            endZoneOffset = ZoneOffset.UTC,
            metadata = Metadata.autoRecorded(
                device = Device(type = Device.TYPE_WATCH)
            )
        )
        healthConnectClient.insertRecords(listOf(stepsRecord))
    } catch (e: Exception) {
        // Run error handling here
    }
}

डेटा अपडेट करना

अगर आपको एक या उससे ज़्यादा रिकॉर्ड में बदलाव करना है, तो अपने डेटा को अपडेट किया जा सकता है. ऐसा खास तौर पर तब करें, जब आपको अपने ऐप्लिकेशन के डेटा स्टोर को Health Connect के डेटा के साथ सिंक करना हो. मौजूदा डेटा को अपडेट करने के दो तरीके हैं. ये तरीके, रिकॉर्ड ढूंढने के लिए इस्तेमाल किए गए आइडेंटिफ़ायर पर निर्भर करते हैं.

मेटाडेटा

सबसे पहले Metadata क्लास की जांच करना ज़रूरी है, क्योंकि डेटा अपडेट करते समय यह ज़रूरी होती है. Health Connect में हर Record बनाते समय, उसमें metadata फ़ील्ड होता है. सिंक करने के लिए, यहां दी गई प्रॉपर्टी काम की हैं:

प्रॉपर्टी ब्यौरा
id Health Connect में हर Record की एक यूनीक id वैल्यू होती है.
नया रिकॉर्ड डालने पर, Health Connect इस फ़ील्ड में जानकारी अपने-आप भर देता है.
lastModifiedTime हर Record, रिकॉर्ड में पिछली बार बदलाव किए जाने का समय भी ट्रैक करता है.
Health Connect इस जानकारी को अपने-आप भर देता है.
clientRecordId हर Record से एक यूनीक आईडी जुड़ा हो सकता है, ताकि आपके ऐप्लिकेशन के डेटास्टोर में उसे रेफ़रंस के तौर पर इस्तेमाल किया जा सके.
आपका ऐप्लिकेशन यह वैल्यू देता है.
clientRecordVersion जिस रिकॉर्ड में clientRecordId है उसमें clientRecordId का इस्तेमाल करके, डेटा को अपने ऐप्लिकेशन के डेटास्टोर में मौजूद वर्शन के साथ सिंक किया जा सकता है.clientRecordVersion
आपका ऐप्लिकेशन यह वैल्यू देता है.

समयसीमा के हिसाब से पढ़े गए लेखों के बाद अपडेट करना

डेटा अपडेट करने के लिए, सबसे पहले ज़रूरी रिकॉर्ड तैयार करें. अगर ज़रूरी हो, तो रिकॉर्ड में बदलाव करें. इसके बाद, बदलाव करने के लिए updateRecords पर कॉल करें.

यहां दिए गए उदाहरण में, डेटा अपडेट करने का तरीका बताया गया है. इसके लिए, हर रिकॉर्ड की ज़ोन ऑफ़सेट वैल्यू को पीएसटी में अडजस्ट किया जाता है.

suspend fun updateSteps(
    healthConnectClient: HealthConnectClient,
    prevRecordStartTime: Instant,
    prevRecordEndTime: Instant
) {
    try {
        val request = healthConnectClient.readRecords(
            ReadRecordsRequest(
                recordType = StepsRecord::class, timeRangeFilter = TimeRangeFilter.between(
                    prevRecordStartTime, prevRecordEndTime
                )
            )
        )

        val newStepsRecords = arrayListOf<StepsRecord>()
        for (record in request.records) {
            // Adjusted both offset values to reflect changes
            val sr = StepsRecord(
                count = record.count,
                startTime = record.startTime,
                startZoneOffset = record.startTime.atZone(ZoneId.of("PST")).offset,
                endTime = record.endTime,
                endZoneOffset = record.endTime.atZone(ZoneId.of("PST")).offset,
                metadata = record.metadata
            )
            newStepsRecords.add(sr)
        }

        healthConnectClient.updateRecords(newStepsRecords)
    } catch (e: Exception) {
        // Run error handling here
    }
}

क्लाइंट रिकॉर्ड आईडी के ज़रिए अपसर्ट करना

अगर आपने क्लाइंट रिकॉर्ड आईडी और क्लाइंट रिकॉर्ड वर्शन की वैकल्पिक वैल्यू का इस्तेमाल किया है, तो हमारा सुझाव है कि updateRecords के बजाय insertRecords का इस्तेमाल करें.

insertRecords फ़ंक्शन में डेटा को अपसर्ट करने की सुविधा होती है. अगर दिए गए Client Record ID के सेट के आधार पर Health Connect में डेटा मौजूद है, तो वह ओवरराइट हो जाता है. अगर ऐसा नहीं है, तो इसे नए डेटा के तौर पर लिखा जाता है. यह तरीका तब काम आता है, जब आपको अपने ऐप्लिकेशन के डेटा स्टोर से Health Connect में डेटा सिंक करना हो.

यहां दिए गए उदाहरण में, ऐप्लिकेशन के डेटास्टोर से पुल किए गए डेटा पर अपसर्ट करने का तरीका बताया गया है:

suspend fun pullStepsFromDatastore() : ArrayList<StepsRecord> {
    val appStepsRecords = arrayListOf<StepsRecord>()
    // Pull data from app datastore
    // ...
    // Make changes to data if necessary
    // ...
    // Store data in appStepsRecords
    // ...
    var sr = StepsRecord(
        metadata = Metadata.autoRecorded(
            clientRecordId = "Your client record ID",
            device = Device(type = Device.TYPE_WATCH)
        ),
        // Assign more parameters for this record
    )
    appStepsRecords.add(sr)
    // ...
    return appStepsRecords
}

suspend fun upsertSteps(
    healthConnectClient: HealthConnectClient,
    newStepsRecords: ArrayList<StepsRecord>
) {
    try {
        healthConnectClient.insertRecords(newStepsRecords)
    } catch (e: Exception) {
        // Run error handling here
    }
}

इसके बाद, इन फ़ंक्शन को अपनी मुख्य थ्रेड में कॉल किया जा सकता है.

upsertSteps(healthConnectClient, pullStepsFromDatastore())

क्लाइंट रिकॉर्ड वर्शन में वैल्यू की जांच करना

अगर डेटा को अपडेट करने की प्रोसेस में क्लाइंट रिकॉर्ड वर्शन शामिल है, तो Health Connect, clientRecordVersion वैल्यू की तुलना करता है. अगर डाले गए डेटा का वर्शन, मौजूदा डेटा के वर्शन से ज़्यादा है, तो अपसर्ट होता है. ऐसा न होने पर, प्रोसेस में बदलाव को अनदेखा कर दिया जाता है और वैल्यू पहले जैसी ही रहती है.

अपने डेटा में वर्शनिंग शामिल करने के लिए, आपको Metadata.clientRecordVersion एट्रिब्यूट की वैल्यू के तौर पर Long एट्रिब्यूट की वैल्यू देनी होगी. यह वैल्यू, वर्शनिंग के लॉजिक के हिसाब से होनी चाहिए.

val endTime = Instant.now()
val startTime = endTime.minus(Duration.ofMinutes(15))

val stepsRecord = StepsRecord(
    count = 100L,
    startTime = startTime,
    startZoneOffset = ZoneOffset.UTC,
    endTime = endTime,
    endZoneOffset = ZoneOffset.UTC,
    metadata = Metadata.manualEntry(
        clientRecordId = "Your supplied record ID",
        clientRecordVersion = 0L, // Your supplied record version
        device = Device(type = Device.TYPE_WATCH)
    )
)

अपसर्ट करने पर, बदलाव होने पर भी version अपने-आप नहीं बढ़ता. इससे डेटा को अनचाहे तरीके से ओवरराइट होने से रोका जा सकता है. इसलिए, आपको मैन्युअल तरीके से इसकी वैल्यू बढ़ानी होगी.

डेटा लिखने के सबसे सही तरीके

ऐप्लिकेशन को सिर्फ़ अपने सोर्स से मिले डेटा को Health Connect में सेव करना होगा.

अगर आपके ऐप्लिकेशन में किसी दूसरे ऐप्लिकेशन से डेटा इंपोर्ट किया गया है, तो Health Connect में अपना डेटा सेव करने की ज़िम्मेदारी उस दूसरे ऐप्लिकेशन की होगी.

इसके अलावा, ऐसा लॉजिक लागू करना भी एक अच्छा तरीका है जो लिखने से जुड़ी गड़बड़ियों को ठीक कर सके. जैसे, डेटा का तय सीमा से बाहर होना या सिस्टम में कोई गड़बड़ी होना. जॉब शेड्यूल करने के मैकेनिज़्म पर, बैकऑफ़ और फिर से कोशिश करने की रणनीतियां लागू की जा सकती हैं. अगर Health Connect में डेटा सेव नहीं हो पाता है, तो पक्का करें कि आपका ऐप्लिकेशन, एक्सपोर्ट के उस पॉइंट से आगे बढ़ सके. डाइग्नोसिस में मदद पाने के लिए, गड़बड़ियों को लॉग करना और उनकी रिपोर्ट करना न भूलें.

डेटा ट्रैक करते समय, यहां दिए गए कुछ सुझावों का पालन किया जा सकता है. ये सुझाव, इस बात पर निर्भर करते हैं कि आपका ऐप्लिकेशन डेटा को कैसे सेव करता है.

टाइम ज़ोन मैनेज करना

समय के हिसाब से रिकॉर्ड लिखते समय, zoneOffset.UTC को डिफ़ॉल्ट रूप से सेट करने से बचें. इसकी वजह यह है कि जब उपयोगकर्ता अन्य ज़ोन में होते हैं, तो इससे टाइमस्टैंप गलत हो सकते हैं. इसके बजाय, डिवाइस की मौजूदा जगह की जानकारी के आधार पर ऑफ़सेट का हिसाब लगाएं. ZoneId.systemDefault() का इस्तेमाल करके, डिवाइस के टाइम ज़ोन की जानकारी वापस पाई जा सकती है.

val endTime = Instant.now()
val startTime = endTime.minus(java.time.Duration.ofDays(1))
val stepsRecords = mutableListOf<StepsRecord>()
var sampleTime = startTime
val minutesBetweenSamples = 15L
while (sampleTime < endTime) {
    // Get the default ZoneId then convert it to an offset
    val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(sampleTime)
    stepsRecords += StepsRecord(
        startTime = sampleTime.minus(java.time.Duration.ofMinutes(minutesBetweenSamples)),
        startZoneOffset = zoneOffset,
        endTime = sampleTime,
        endZoneOffset = zoneOffset,
        count = Random.nextLong(1, 100),
        metadata = Metadata.unknownRecordingMethod(),
    )
    sampleTime = sampleTime.plus(java.time.Duration.ofMinutes(minutesBetweenSamples))
}
healthConnectClient.insertRecords(
    stepsRecords
)

ज़्यादा जानकारी के लिए, ZoneId के लिए दस्तावेज़ देखें.

पैसिव ट्रैकिंग

इसमें ऐसे ऐप्लिकेशन शामिल हैं जो पैसिव फ़िटनेस या सेहत की ट्रैकिंग करते हैं. जैसे, बैकग्राउंड में लगातार कदमों या धड़कन की दर को रिकॉर्ड करना.

नया डेटा उपलब्ध होने पर, उसे Health Connect में जितनी बार हो सके उतनी बार लिखें. हालांकि, इस दौरान डिवाइस की परफ़ॉर्मेंस का ध्यान रखें. बैटरी लाइफ़ और परफ़ॉर्मेंस के अन्य पहलुओं पर बुरा असर न पड़े, इसके लिए राइट ऑपरेशन के बीच ज़्यादा से ज़्यादा 15 मिनट का अंतराल होना चाहिए.

इन दिशा-निर्देशों का पालन करें:

  • हर सिंक पर, सिर्फ़ नया डेटा और अपडेट किया गया वह डेटा लिखें जिसमें पिछले सिंक के बाद बदलाव किया गया है.
  • हर अनुरोध में ज़्यादा से ज़्यादा 1,000 रिकॉर्ड शामिल करें.
  • WorkManager का इस्तेमाल करके, समय-समय पर होने वाले बैकग्राउंड टास्क शेड्यूल करें. इसके लिए, ज़्यादा से ज़्यादा 15 मिनट की अवधि तय करें.
  • टास्क सिर्फ़ तब चलाएं, जब डिवाइस कुछ समय से इस्तेमाल में न हो और बैटरी का लेवल कम न हो.

नीचे दिए गए कोड में, WorkManager का इस्तेमाल करके, समय-समय पर बैकग्राउंड टास्क शेड्यूल किए जाते हैं. इसके लिए, ज़्यादा से ज़्यादा 15 मिनट की अवधि और पांच मिनट का फ़्लेक्स इंटरवल तय किया जाता है. इस कॉन्फ़िगरेशन को PeriodicWorkRequest.Builder क्लास का इस्तेमाल करके सेट किया जाता है.

val constraints = Constraints.Builder()
    .requiresBatteryNotLow()
    .requiresDeviceIdle(true)
    .build()

val writeDataWork = PeriodicWorkRequestBuilder<WriteDataToHealthConnectWorker>(
        15,
        TimeUnit.MINUTES,
        5,
        TimeUnit.MINUTES
    )
    .setConstraints(constraints)
    .build()

ऐक्टिव ट्रैकिंग

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

पुष्टि करें कि आपका ऐप्लिकेशन, इवेंट की पूरी अवधि के दौरान Health Connect को चालू नहीं रखता है.

डेटा को Health Connect में दो में से किसी एक तरीके से सेव किया जाना चाहिए:

  • इवेंट पूरा होने के बाद, Health Connect के साथ डेटा सिंक करें. उदाहरण के लिए, जब उपयोगकर्ता ट्रैक की गई कसरत का सेशन खत्म करता है, तब डेटा सिंक करें.
  • डेटा को बाद में सिंक करने के लिए, WorkManager का इस्तेमाल करके, एक बार होने वाले टास्क को शेड्यूल करें.

डेटा लिखने की फ़्रीक्वेंसी और ग्रेन्यूलैरिटी के लिए सबसे सही तरीके

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

  1. डेटा लिखने की फ़्रीक्वेंसी: आपका ऐप्लिकेशन, Health Connect में कितनी बार नया डेटा भेजता है. नया डेटा उपलब्ध होने पर, डिवाइस की परफ़ॉर्मेंस को ध्यान में रखते हुए, डेटा को ज़्यादा से ज़्यादा बार लिखें. बैटरी लाइफ़ और परफ़ॉर्मेंस के अन्य पहलुओं पर बुरा असर न पड़े, इसके लिए राइट के बीच ज़्यादा से ज़्यादा 15 मिनट का अंतराल होना चाहिए.

  2. लिखे गए डेटा की जानकारी का लेवल: पुश किए गए डेटा को कितनी बार सैंपल किया गया. उदाहरण के लिए, हर पांच सेकंड में धड़कन की दर के सैंपल लिखो. हर डेटा टाइप के लिए, एक जैसा सैंपल रेट ज़रूरी नहीं होता. हर सेकंड में कदमों की संख्या का डेटा अपडेट करने से कोई खास फ़ायदा नहीं होता. इसके बजाय, इसे कम बार अपडेट किया जा सकता है. जैसे, हर 60 सेकंड में. हालांकि, सैंपल रेट ज़्यादा होने पर उपयोगकर्ताओं को सेहत और फ़िटनेस के डेटा के बारे में ज़्यादा जानकारी मिल सकती है. साथ ही, वे डेटा को ज़्यादा बारीकी से देख सकते हैं. सैंपल रेट फ़्रीक्वेंसी में, बारीकी से जानकारी और परफ़ॉर्मेंस के बीच संतुलन होना चाहिए.

पूरे दिन मॉनिटर किए गए डेटा को लिखना

अगर आपका ऐप्लिकेशन, लगातार इकट्ठा होने वाला डेटा सेव करता है, जैसे कि कदमों की संख्या, तो उसे नया डेटा उपलब्ध होने पर, Health Connect में जितनी बार हो सके उतनी बार डेटा सेव करना चाहिए. बैटरी लाइफ़ और परफ़ॉर्मेंस के अन्य पहलुओं पर बुरा असर न पड़े, इसके लिए राइट के बीच ज़्यादा से ज़्यादा 15 मिनट का अंतराल होना चाहिए.

डेटा टाइप

यूनिट

अनुमानित

उदाहरण

कदम

कदम

हर 1 मिनट में

23:14 - 23:15 - 5 कदम

23:16 - 23:17 - 22 कदम

23:17 - 23:18 - 8 कदम

StepsCadence

कदम/मिनट

हर 1 मिनट में

23:14 - 23:15 - 5 एसपीएम

23:16 - 23:17 - 22 एसपीएम

23:17 - 23:18 - 8 एसपीएम

व्हीलचेयर पुश करने से जुड़ा डेटा

पुश करता है

हर 1 मिनट में

23:14 - 23:15 - 5 पुश

23:16 - 23:17 - 22 पुश

23:17 - 23:18 - 8 पुश

ActiveCaloriesBurned

कैलोरी

प्रत्‍येक 15 मिनट

23:15 - 23:30 - 2 कैलोरी

23:30 - 23:45 - 25 कैलोरी

23:45 - 00:00 - 5 कैलोरी

TotalCaloriesBurned

कैलोरी

प्रत्‍येक 15 मिनट

23:15 - 23:30 - 16 कैलोरी

23:30 - 23:45 - 16 कैलोरी

23:45 - 00:00 - 16 कैलोरी

तय की गई दूरी

कि॰मी॰/मि॰

हर 1 मिनट में

23:14-23:15 - 0.008 कि॰मी॰

23:16 - 23:16 - 0.021 कि॰मी॰

23:17 - 23:18 - 0.012 कि॰मी॰

ElevationGained

m

हर 1 मिनट में

20:36 - 20:37 - 3.048 मीटर

20:39 - 20:40 - 3.048 मीटर

23:23 - 23:24 - 9.144 मीटर

FloorsClimbed

मंज़िल

हर 1 मिनट में

23:14 से 23:15 - 5 फ़्लोर

23:16 - 23:16 - 22 फ़्लोर

23:17 - 23:18 - 8 फ़्लोर

HeartRate

बीपीएम

एक मिनट में चार बार

सुबह 6:11:15 बजे - 55 बीपीएम

सुबह 6:11:30 बजे - 56 बीपीएम

सुबह 6:11:45 बजे - 56 बीपीएम

सुबह 6:12:00 बजे - 55 बीपीएम

HeartRateVariabilityRmssd

ms

हर 1 मिनट में

सुबह 6:11 बजे - 23 मिलीसेकंड

RespiratoryRate

साँस/मिनट

हर 1 मिनट में

23:14 - 23:15 - 60 सांसें/मिनट

23:16 - 23:16 - 62 सांसें/मिनट

23:17 - 23:18 - 64 सांसें/मिनट

OxygenSaturation

%

हर 1 घंटे में

6:11 - 95.208%

सेशन का डेटा सेव करने की अनुमति दें

कसरत या नींद के सेशन के खत्म होने के बाद, Health Connect में डेटा सेव किया जाना चाहिए.

आपका आवेदन, कम से कम इस टेबल में अनुमानित कॉलम में दिए गए दिशा-निर्देशों के मुताबिक होना चाहिए. जहां भी हो सके, सबसे सही दिशा-निर्देशों का पालन करें.

कसरत और नींद के सेशन

नीचे दिए गए उदाहरण में, कसरत के दौरान डेटा लिखने का तरीका बताया गया है:

डेटा टाइप

यूनिट

अनुमानित

धन्यवाद

उदाहरण

कदम

कदम

हर 1 मिनट में

हर 1 सेकंड में

23:14-23:15 - 5 चरण

23:16 - 23:17 - 22 कदम

23:17 - 23:18 - 8 कदम

StepsCadence

कदम/मिनट

हर 1 मिनट में

हर 1 सेकंड में

रात 11:14 से 11:15 बजे तक - 35 एसपीएम

23:16 - 23:17 - 37 एसपीएम

23:17 - 23:18 - 40 कदम प्रति मिनट

व्हीलचेयर पुश करने से जुड़ा डेटा

पुश करता है

हर 1 मिनट में

हर 1 सेकंड में

23:14-23:15 - 5 पुश

23:16 - 23:17 - 22 पुश

23:17 - 23:18 - 8 पुश

CyclingPedalingCadence

आरपीएम

हर 1 मिनट में

हर 1 सेकंड में

23:14-23:15 - 65 आरपीएम

23:16 - 23:17 - 70 आरपीएम

23:17 - 23:18 - 68 आरपीएम

ताकत

वॉट

हर 1 मिनट में

हर 1 सेकंड में

23:14-23:15 - 250 वॉट

23:16 - 23:17 - 255 वॉट

23:17 - 23:18 - 245 वॉट

स्पीड

कि॰मी॰/मि॰

हर 1 मिनट में

हर 1 सेकंड में

23:14-23:15 - 0.3 कि॰मी॰/मिनट

23:16 - 23:17 - 0.4 कि॰मी॰/मिनट

23:17 - 23:18 -0.4 कि॰मी॰/मिनट

तय की गई दूरी

कि॰मी॰/मी॰

हर 1 मिनट में

हर 1 सेकंड में

23:14-23:15 - 0.008 कि॰मी॰

23:16 - 23:16 - 0.021 कि॰मी॰

23:17 - 23:18 - 0.012 कि॰मी॰

ActiveCaloriesBurned

कैलोरी

हर 1 मिनट में

हर 1 सेकंड में

23:14-23:15 - 20 कैलोरी

23:16 - 23:17 - 20 कैलोरी

23:17 - 23:18 - 25 कैलोरी

TotalCaloriesBurned

कैलोरी

हर 1 मिनट में

हर 1 सेकंड में

23:14-23:15 - 36 कैलोरी

23:16 - 23:17 - 36 कैलोरी

23:17 - 23:18 - 41 कैलोरी

ElevationGained

m

हर 1 मिनट में

हर 1 सेकंड में

20:36 - 20:37 - 3.048 मीटर

20:39 - 20:40 - 3.048 मीटर

23:23 - 23:24 - 9.144 मीटर

ExerciseRoutes

lat/lng/alt

हर तीन से पांच सेकंड में

हर 1 सेकंड में

HeartRate

बीपीएम

एक मिनट में चार बार

हर 1 सेकंड में

23:14-23:15 - 150 बीपीएम

नीचे दिए गए उदाहरण में, नींद के सेशन के दौरान या बाद में डेटा लिखने का तरीका बताया गया है:

डेटा टाइप

यूनिट

अनुमानित सैंपल

उदाहरण

नींद के चरण का पता लगाना

स्टेज

नींद के हर चरण के हिसाब से समय की जानकारी

23:46 - 23:50 - जगे रहना

23:50 - 23:56 - हल्की नींद

23:56 - 00:16 - गहरी नींद

RestingHeartRate

बीपीएम

हर दिन की एक वैल्यू (सुबह सबसे पहले अपडेट होने की उम्मीद है)

सुबह 6:11 बजे - 60 बीपीएम

OxygenSaturation

%

हर दिन की एक वैल्यू (सुबह सबसे पहले अपडेट होने की उम्मीद है)

6:11 - 95.208%

मल्टी-स्पोर्ट इवेंट

इस तरीके में, मौजूदा डेटा टाइप और स्ट्रक्चर का इस्तेमाल किया जाता है. साथ ही, यह पुष्टि की जाती है कि यह तरीका, Health Connect के मौजूदा तरीकों और डेटा रीडर के साथ काम करता है. फ़िटनेस प्लैटफ़ॉर्म, आम तौर पर इसी तरीके का इस्तेमाल करते हैं.

यहां दिए गए उदाहरण में, ट्रायथलॉन के लिए डेटा लिखने का तरीका बताया गया है:

val swimStartTime = Instant.parse("2024-08-22T08:00:00Z")
val swimEndTime = Instant.parse("2024-08-22T08:30:00Z")
val bikeStartTime = Instant.parse("2024-08-22T08:40:00Z")
val bikeEndTime = Instant.parse("2024-08-22T09:40:00Z")
val runStartTime = Instant.parse("2024-08-22T09:50:00Z")
val runEndTime = Instant.parse("2024-08-22T10:20:00Z")

val swimSession = ExerciseSessionRecord(
    startTime = swimStartTime,
    endTime = swimEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_SWIMMING_OPEN_WATER,
    metadata = Metadata.autoRecorded(
      device = Device(type = Device.TYPE_WATCH)
    )
)

val bikeSession = ExerciseSessionRecord(
    startTime = bikeStartTime,
    endTime = bikeEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_BIKING,
    metadata = Metadata.autoRecorded(
      device = Device(type = Device.TYPE_WATCH)
    )
)

val runSession = ExerciseSessionRecord(
    startTime = runStartTime,
    endTime = runEndTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
    metadata = Metadata.autoRecorded(
      device = Device(type = Device.TYPE_WATCH)
    )
)

healthConnectClient.insertRecords(listOf(swimSession, bikeSession, runSession))