মোট ডেটা পড়া

Health Connect-এ ডেটা একত্রিত করার মধ্যে রয়েছে প্রাথমিক একত্রিতকরণ বা ডেটা বাকেটে একত্রিত করা। নিচের ওয়ার্কফ্লো থেকে আপনি কীভাবে এই দুটি কাজই করবেন তা জানতে পারবেন।

প্রাথমিক এগ্রিগেশন

আপনার ডেটাতে সাধারণ অ্যাগ্রিগেশন ব্যবহার করতে, আপনার HealthConnectClient অবজেক্টে aggregate ফাংশন ব্যবহার করুন। এটি একটি AggregateRequest অবজেক্ট গ্রহণ করে যেখানে আপনি মেট্রিক ধরন এবং সময়সীমা প্যারামিটার হিসেবে যোগ করেন। কীভাবে প্রাথমিক অ্যাগ্রিগেট কল করা হয় তা নির্ভর করে ব্যবহৃত মেট্রিকের ধরনের উপর।

ক্রমশ বৃদ্ধি পাওয়া এগ্রিগেশন

কিউমুলেটিভ এগ্রিগেশন মোট ভ্যালু গণনা করে।

কোনও ডেটার ধরনের জন্য কীভাবে ডেটা এগ্রিগেট করতে হয় তা নিম্নলিখিত উদাহরণ থেকে দেখুন:

suspend fun readDistanceAggregate(startTime: Instant, endTime: Instant): Number {
    val response = healthConnectClient.aggregate(
        AggregateRequest(
            metrics = setOf(DistanceRecord.DISTANCE_TOTAL),
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )
    return response[DistanceRecord.DISTANCE_TOTAL]?.inMeters ?: 0L
}

ডেটার উৎস অনুযায়ী ফিল্টার করা

এছাড়াও, আপনি মোট ডেটা তার সোর্স অনুযায়ী ফিল্টার করতে পারবেন। যেমন, শুধুমাত্র নির্দিষ্ট অ্যাপের লেখা ডেটা অন্তর্ভুক্ত করা।

নির্দিষ্ট অ্যাপ থেকে ধাপ একত্রিত করতে কীভাবে 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 readHeartRateAggregate(startTime: Instant, endTime: Instant): Pair<Long, Long> {
    val response = healthConnectClient.aggregate(
        AggregateRequest(
            metrics = setOf(HeartRateRecord.BPM_MAX, HeartRateRecord.BPM_MIN),
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )
    val minimumHeartRate = response[HeartRateRecord.BPM_MIN] ?: 0L
    val maximumHeartRate = response[HeartRateRecord.BPM_MAX] ?: 0L

    return maximumHeartRate to minimumHeartRate
}

বাকেট

এছাড়াও, Health Connect আপনাকে ডেটা বাকেটে এগ্রিগেট করতে দেয়। আপনি যে দুই ধরনের বাকেট ব্যবহার করতে পারেন তার মধ্যে সময়সীমা ও পিরিয়ড অন্তর্ভুক্ত।

কল করা হলে, এটি বালতির একটি তালিকা রিটার্ন করে। মনে রাখবেন, তালিকাটি ফাঁকা হতে পারে, তাই কোনও বাকেটে কোনও ডেটা না থাকলে সেটি তালিকায় অন্তর্ভুক্ত করা হয় না।

সময়সীমা

এই ক্ষেত্রে, অ্যাগ্রিগেট করা ডেটা নির্দিষ্ট দৈর্ঘ্যের সময়ের মধ্যে, যেমন এক মিনিট বা এক ঘণ্টার মধ্যে, বাকেটে ভাগ করা হয়। ডেটা বাকেটে একত্রিত করতে, 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 থেকে সব অ্যাপ্লিকেশন ডেটা পড়তে পারে।

আপনাকে যদি কোনও ডিফল্ট বিধিনিষেধের বাইরে রিড অ্যাক্সেস বাড়াতে হয়, তাহলে PERMISSION_READ_HEALTH_DATA_HISTORY-এর জন্য অনুরোধ করুন। অন্যথায়, এই অনুমতি না থাকলে, ৩০ দিনের পুরনো রেকর্ড পড়ার চেষ্টা করলে সমস্যা হয়।

মুছে দেওয়া অ্যাপের জন্য অনুমতির ইতিহাস

কোনও ব্যবহারকারী আপনার অ্যাপ মুছে দিলে, ইতিহাস সংক্রান্ত অনুমতি সহ সব অনুমতি প্রত্যাহার করা হয়। ব্যবহারকারী আপনার অ্যাপ আবার ইনস্টল করে অনুমতি দিলে, একই ডিফল্ট বিধিনিষেধ প্রযোজ্য হবে এবং আপনার অ্যাপ সেই নতুন তারিখের আগের ৩০ দিন পর্যন্ত Health Connect থেকে ডেটা পড়তে পারবে।

যেমন, ধরুন ব্যবহারকারী ১০ মে, ২০২৩-এ আপনার অ্যাপ মুছে দিয়েছেন এবং তারপরে ১৫ মে, ২০২৩-এ অ্যাপটি আবার ইনস্টল করে পড়ার অনুমতি দিয়েছেন। আপনার অ্যাপ এখন ডিফল্ট হিসেবে সবচেয়ে আগের যে তারিখের ডেটা পড়তে পারবে সেটি হল ১৫ এপ্রিল, ২০২৩।

ব্যবহারকারীর বেছে নেওয়া অ্যাপের অগ্রাধিকারের কারণে প্রভাবিত হওয়া মোট ডেটা

যেসব স্লিপ ও অ্যাক্টিভিটি অ্যাপ Health Connect-এর সাথে ইন্টিগ্রেট করা হয়েছে সেগুলির জন্য শেষ ব্যবহারকারী অগ্রাধিকার সেট করতে পারবেন। শুধুমাত্র গ্রাহকরাই এই অগ্রাধিকার তালিকা পরিবর্তন করতে পারবেন। আপনি কোনও এগ্রিগেট রিড পারফর্ম করলে, এগ্রিগেট 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_TOTAL, MONOUNSATURATED_FAT_TOTAL, NIACIN_TOTAL, PANTOTHENIC_ACID_TOTAL, PHOSPHORUS_TOTAL, POLYUNSATURATED_FAT_TOTAL, POTASSIUM_TOTAL, PROTEIN_TOTAL, RIBOFLAVIN_TOTAL, SATURATED_FAT_TOTAL, SELENIUM_TOTAL, SODIUM_TOTAL, SUGAR_TOTAL, THIAMIN_TOTAL, TOTAL_CARBOHYDRATE_TOTAL, TOTAL_FAT_TOTAL, TRANS_FAT_TOTAL, UNSATURATED_FAT_TOTAL, VITAMIN_A_TOTAL, VITAMIN_B12_TOTAL, VITAMIN_B6_TOTAL, VITAMIN_C_TOTAL, VITAMIN_D_TOTAL, VITAMIN_E_TOTAL, VITAMIN_K_TOTAL, ZINC_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