इकट्ठा किया गया डेटा देखना

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

बेसिक एग्रीगेशन

अपने डेटा पर बुनियादी एग्रीगेशन का इस्तेमाल करने के लिए, अपने HealthConnectClient ऑब्जेक्ट पर aggregate फ़ंक्शन का इस्तेमाल करें. यह AggregateRequest ऑब्जेक्ट को स्वीकार करता है. इसमें मेट्रिक टाइप और समयसीमा को पैरामीटर के तौर पर जोड़ा जाता है. बुनियादी एग्रीगेट को कॉल करने का तरीका, इस्तेमाल की गई मेट्रिक के टाइप पर निर्भर करता है.

कुल एग्रीगेशन

कुल एग्रीगेशन, कुल वैल्यू का हिसाब लगाता है.

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

suspend fun aggregateDistance(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response = healthConnectClient.aggregate(
            AggregateRequest(
                metrics = setOf(DistanceRecord.DISTANCE_TOTAL),
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
        // The result may be null if no data is available in the time range
        val distanceTotalInMeters = response[DistanceRecord.DISTANCE_TOTAL]?.inMeters ?: 0L
    } catch (e: Exception) {
        // Run error handling here
    }
}

डेटा के ओरिजन के हिसाब से फ़िल्टर करना

कुल डेटा को उसके ऑरिजिन के हिसाब से भी फ़िल्टर किया जा सकता है. उदाहरण के लिए, सिर्फ़ किसी ऐप्लिकेशन से लिखा गया डेटा शामिल करना.

यहां दिए गए उदाहरण में, किसी ऐप्लिकेशन से मिले चरणों की जानकारी को इकट्ठा करने के लिए, dataOriginFilter और AggregateRequest का इस्तेमाल करने का तरीका बताया गया है:

suspend fun aggregateStepsFromSpecificApp(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant,
    appPackageName: String
) {
    try {
        val response = healthConnectClient.aggregate(
            AggregateRequest(
                metrics = setOf(StepsRecord.COUNT_TOTAL),
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
                dataOriginFilter = setOf(DataOrigin(appPackageName))
            )
        )
        // The result may be null if no data is available in the time range
        val totalSteps = response[StepsRecord.COUNT_TOTAL] ?: 0L
    } catch (e: Exception) {
        // Run error handling here
    }
}

आंकड़ों का एग्रीगेशन

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

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

suspend fun aggregateHeartRate(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    try {
        val response =
            healthConnectClient.aggregate(
                AggregateRequest(
                    setOf(HeartRateRecord.BPM_MAX, HeartRateRecord.BPM_MIN),
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
                )
            )
        // The result may be null if no data is available in the time range
        val minimumHeartRate = response[HeartRateRecord.BPM_MIN] ?: 0L
        val maximumHeartRate = response[HeartRateRecord.BPM_MAX] ?: 0L
    } catch (e: Exception) {
        // Run error handling here
    }
}

बकेट

Health Connect, डेटा को बकेट में इकट्ठा करने की सुविधा भी देता है. duration और period, दो तरह के बकेट हैं जिनका इस्तेमाल किया जा सकता है.

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

कुल अवधि

इस मामले में, एग्रीगेट किए गए डेटा को तय समयसीमा के अंदर बकेट में बांटा जाता है. जैसे, एक मिनट या एक घंटा. डेटा को बकेट में एग्रीगेट करने के लिए, aggregateGroupByDuration का इस्तेमाल करें. यह AggregateGroupByDurationRequest ऑब्जेक्ट को स्वीकार करता है. इसमें मेट्रिक टाइप, समयसीमा, और Duration को पैरामीटर के तौर पर जोड़ा जाता है. TimeRangeFilter में startTime और endTime के लिए, Instant या LocalDateTime ऑब्जेक्ट के जोड़े इस्तेमाल किए जा सकते हैं.

यहां, एक मिनट के बकेट में चरणों को इकट्ठा करने का उदाहरण दिया गया है:

suspend fun aggregateStepsIntoMinutes(
    healthConnectClient: HealthConnectClient,
    startTime: LocalDateTime,
    endTime: LocalDateTime
) {
    try {
        val response =
            healthConnectClient.aggregateGroupByDuration(
                AggregateGroupByDurationRequest(
                    metrics = setOf(StepsRecord.COUNT_TOTAL),
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
                    timeRangeSlicer = Duration.ofMinutes(1L)
                )
            )
        for (durationResult in response) {
            // The result may be null if no data is available in the time range
            val totalSteps = durationResult.result[StepsRecord.COUNT_TOTAL] ?: 0L
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

पीरियड का बटन

इस मामले में, इकट्ठा किए गए डेटा को तारीख के हिसाब से तय की गई समयावधि के अंदर बकेट में बांटा जाता है. जैसे, एक हफ़्ता या एक महीना. डेटा को बकेट में एग्रीगेट करने के लिए, aggregateGroupByPeriod का इस्तेमाल करें. यह AggregateGroupByPeriodRequest ऑब्जेक्ट को स्वीकार करता है. इसमें मेट्रिक टाइप, समयसीमा, और Period को पैरामीटर के तौर पर जोड़ा जाता है.

यहां चरणों को महीने के हिसाब से बकेट में इकट्ठा करने का उदाहरण दिया गया है:

suspend fun aggregateStepsIntoMonths(
    healthConnectClient: HealthConnectClient,
    startTime: LocalDateTime,
    endTime: LocalDateTime
) {
    try {
        val response =
            healthConnectClient.aggregateGroupByPeriod(
                AggregateGroupByPeriodRequest(
                    metrics = setOf(StepsRecord.COUNT_TOTAL),
                    timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
                    timeRangeSlicer = Period.ofMonths(1)
                )
            )
        for (monthlyResult in response) {
            // The result may be null if no data is available in the time range
            val totalSteps = monthlyResult.result[StepsRecord.COUNT_TOTAL] ?: 0L
        }
    } catch (e: Exception) {
        // Run error handling here
    }
}

पाबंदियां पढ़ना

डिफ़ॉल्ट रूप से, सभी ऐप्लिकेशन को Health Connect से 30 दिन पहले का डेटा ऐक्सेस करने की अनुमति होती है. यह अवधि, पहली बार अनुमति दिए जाने से शुरू होती है.

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

मिटाए गए ऐप्लिकेशन के लिए अनुमतियों का इतिहास

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

उदाहरण के लिए, मान लें कि उपयोगकर्ता ने 10 मई, 2023 को आपका ऐप्लिकेशन मिटा दिया. इसके बाद, उसने 15 मई, 2023 को ऐप्लिकेशन को फिर से इंस्टॉल किया और पढ़ने की अनुमतियां दीं. आपका ऐप्लिकेशन अब डिफ़ॉल्ट रूप से, 15 अप्रैल, 2023 से डेटा पढ़ सकता है.

उपयोगकर्ता की ओर से चुने गए ऐप्लिकेशन की प्राथमिकताओं से जुड़ा एग्रीगेट किया गया डेटा

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

ऐप्लिकेशन की प्राथमिकता का क्रम बदलने की सुविधा दिखाने वाली इमेज
पहली इमेज: ऐप्लिकेशन की प्राथमिकताएं फिर से क्रम में लगाएं

ऐप्लिकेशन की प्राथमिकता का क्रम बदलने की सुविधा दिखाने वाली इमेज

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

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

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

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

बैकग्राउंड में पढ़ने की सुविधा

आपके पास यह अनुरोध करने का विकल्प होता है कि आपका ऐप्लिकेशन बैकग्राउंड में चलता रहे और Health Connect से डेटा ऐक्सेस करता रहे. बैकग्राउंड में डेटा पढ़ने की अनुमति का अनुरोध करने पर, उपयोगकर्ता आपके ऐप्लिकेशन को बैकग्राउंड में डेटा पढ़ने का ऐक्सेस दे सकता है.

रिकॉर्ड के हिसाब से, एग्रीगेट किए गए डेटा के टाइप

इस टेबल में, Health Connect रिकॉर्ड के साथ काम करने वाले सभी एग्रीगेट डेटा टाइप की सूची दी गई है.

टेबल: रिकॉर्ड के हिसाब से, एग्रीगेट किए गए डेटा के साथ काम करने वाले टाइप
रिकॉर्डिंग टाइप चुनें एग्रीगेट किया गया डेटा टाइप
ActiveCaloriesBurnedRecord ACTIVE_CALORIES_TOTAL
ActivityIntensityRecord DURATION_TOTAL, INTENSITY_MINUTES_TOTAL, MODERATE_DURATION_TOTAL, VIGOROUS_DURATION_TOTAL
BasalMetabolicRateRecord BASAL_CALORIES_TOTAL
BloodPressureRecord DIASTOLIC_AVG, DIASTOLIC_MAX, DIASTOLIC_MIN, SYSTOLIC_AVG, SYSTOLIC_MAX, SYSTOLIC_MIN
CyclingPedalingCadenceRecord RPM_AVG, RPM_MAX, RPM_MIN
DistanceRecord DISTANCE_TOTAL
ElevationGainedRecord ELEVATION_GAINED_TOTAL
ExerciseSessionRecord EXERCISE_DURATION_TOTAL
FloorsClimbedRecord FLOORS_CLIMBED_TOTAL
HeartRateRecord BPM_AVG, BPM_MAX, BPM_MIN, MEASUREMENTS_COUNT
HeightRecord HEIGHT_AVG, HEIGHT_MAX, HEIGHT_MIN
HydrationRecord VOLUME_TOTAL
MindfulnessSessionRecord MINDFULNESS_DURATION_TOTAL
NutritionRecord BIOTIN_TOTAL, CAFFEINE_TOTAL, CALCIUM_TOTAL, CHLORIDE_TOTAL, CHOLESTEROL_TOTAL, CHROMIUM_TOTAL, COPPER_TOTAL, DIETARY_FIBER_TOTAL, ENERGY_FROM_FAT_TOTAL, ENERGY_TOTAL, FOLATE_TOTAL, FOLIC_ACID_TOTAL, IODINE_TOTAL, IRON_TOTAL, MAGNESIUM_TOTAL, MANGANESE_TOTAL,  , ,  ,  ,  ,  , , , , , , , , , , , , , , , , , ,  ,  ,  MOLYBDENUM_TOTALMONOUNSATURATED_FAT_TOTALNIACIN_TOTALPANTOTHENIC_ACID_TOTALPHOSPHORUS_TOTALPOLYUNSATURATED_FAT_TOTALPOTASSIUM_TOTALPROTEIN_TOTALRIBOFLAVIN_TOTALSATURATED_FAT_TOTALSELENIUM_TOTALSODIUM_TOTALSUGAR_TOTALTHIAMIN_TOTALTOTAL_CARBOHYDRATE_TOTALTOTAL_FAT_TOTALTRANS_FAT_TOTALUNSATURATED_FAT_TOTALVITAMIN_A_TOTALVITAMIN_B12_TOTALVITAMIN_B6_TOTALVITAMIN_C_TOTALVITAMIN_D_TOTALVITAMIN_E_TOTALVITAMIN_K_TOTALZINC_TOTAL
PowerRecord POWER_AVG, POWER_MAX, POWER_MIN
RestingHeartRateRecord BPM_AVG, BPM_MAX, BPM_MIN
SkinTemperatureRecord TEMPERATURE_DELTA_AVG, TEMPERATURE_DELTA_MAX, TEMPERATURE_DELTA_MIN
SleepSessionRecord SLEEP_DURATION_TOTAL
SpeedRecord SPEED_AVG, SPEED_MAX, SPEED_MIN
StepsRecord COUNT_TOTAL
StepsCadenceRecord RATE_AVG, RATE_MAX, RATE_MIN
TotalCaloriesBurnedRecord ENERGY_TOTAL
WeightRecord WEIGHT_AVG, WEIGHT_MAX, WEIGHT_MIN
WheelchairPushesRecord COUNT_TOTAL