হেলথ কানেক্ট-এ ডেটা একত্রিত করার মধ্যে সাধারণ একত্রীকরণ অথবা ডেটাকে বিভিন্ন বাকেটে ভাগ করা অন্তর্ভুক্ত। নিম্নলিখিত ওয়ার্কফ্লো-গুলো আপনাকে দেখাবে কীভাবে এই দুটি কাজই করতে হয়।
মৌলিক একত্রীকরণ
আপনার ডেটাতে বেসিক অ্যাগ্রিগেশন ব্যবহার করতে, আপনার 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 }
বালতি
হেলথ কানেক্ট আপনাকে ডেটাকে বিভিন্ন বাকেটে একত্রিত করার সুযোগও দেয়। আপনি যে দুই ধরনের বাকেট ব্যবহার করতে পারেন, সেগুলো হলো সময়কাল (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 } }
বিধিনিষেধ পড়ুন
ডিফল্টরূপে, সমস্ত অ্যাপ্লিকেশন প্রথমবার কোনো অনুমতি দেওয়ার ৩০ দিন পূর্ব পর্যন্ত হেলথ কানেক্ট থেকে ডেটা পড়তে পারে।
ডিফল্ট সীমাবদ্ধতার বাইরে পড়ার অনুমতি বাড়ানোর প্রয়োজন হলে, PERMISSION_READ_HEALTH_DATA_HISTORY অনুমতির জন্য অনুরোধ করুন। অন্যথায়, এই অনুমতি ছাড়া, ৩০ দিনের বেশি পুরোনো রেকর্ড পড়ার চেষ্টা করলে একটি ত্রুটি দেখা দেবে।
মুছে ফেলা অ্যাপের অনুমতির ইতিহাস
যদি কোনো ব্যবহারকারী আপনার অ্যাপটি ডিলিট করে দেন, তাহলে হিস্ট্রি পারমিশন সহ সমস্ত পারমিশন বাতিল হয়ে যাবে। যদি ব্যবহারকারী আপনার অ্যাপটি পুনরায় ইনস্টল করেন এবং আবার পারমিশন দেন, তাহলে আগের ডিফল্ট বিধিনিষেধগুলোই প্রযোজ্য হবে এবং আপনার অ্যাপটি সেই নতুন তারিখের আগের ৩০ দিন পর্যন্ত হেলথ কানেক্ট থেকে ডেটা পড়তে পারবে।
উদাহরণস্বরূপ, ধরুন ব্যবহারকারী ১০ই মে, ২০২৩ তারিখে আপনার অ্যাপটি ডিলিট করে দিলেন এবং তারপর ১৫ই মে, ২০২৩ তারিখে অ্যাপটি পুনরায় ইনস্টল করে রিড পারমিশন দিলেন। এখন থেকে আপনার অ্যাপটি ডিফল্টভাবে সর্বনিম্ন যে তারিখ থেকে ডেটা রিড করতে পারবে, তা হলো ১৫ই এপ্রিল, ২০২৩ ।
ব্যবহারকারী-নির্বাচিত অ্যাপের অগ্রাধিকার দ্বারা প্রভাবিত সমষ্টিগত ডেটা
ব্যবহারকারীরা হেলথ কানেক্ট-এর সাথে ইন্টিগ্রেট করা স্লিপ এবং অ্যাক্টিভিটি অ্যাপগুলোর জন্য অগ্রাধিকার নির্ধারণ করতে পারেন। শুধুমাত্র ব্যবহারকারীরাই এই অগ্রাধিকার তালিকা পরিবর্তন করতে পারেন। যখন আপনি অ্যাগ্রিগেট রিড করেন, তখন অ্যাগ্রিগেট এপিআই যেকোনো ডুপ্লিকেট ডেটা বিবেচনা করে এবং শুধুমাত্র সর্বোচ্চ অগ্রাধিকারপ্রাপ্ত অ্যাপের ডেটা রাখে। যদি ব্যবহারকারী একই সময়ে একাধিক অ্যাপের মাধ্যমে একই ধরনের ডেটা—যেমন গৃহীত পদক্ষেপের সংখ্যা বা অতিক্রান্ত দূরত্ব—লিখন করেন, তাহলে ডুপ্লিকেট ডেটা থাকতে পারে।
ব্যবহারকারীরা কীভাবে তাদের অ্যাপগুলোকে অগ্রাধিকার দিতে পারেন, সে সম্পর্কে তথ্যের জন্য ‘ম্যানেজ হেলথ কানেক্ট ডেটা’ দেখুন।
ব্যবহারকারী অ্যাপ যোগ বা অপসারণ করার পাশাপাশি সেগুলোর অগ্রাধিকারও পরিবর্তন করতে পারেন। একজন ব্যবহারকারী এমন একটি অ্যাপ অপসারণ করতে চাইতে পারেন যেটি একই ডেটা একাধিকবার লিখছে, যাতে হেলথ কানেক্ট স্ক্রিনের মোট ডেটার পরিমাণ, তার সর্বোচ্চ অগ্রাধিকার দেওয়া অ্যাপটির ডেটার পরিমাণের সমান হয়। মোট ডেটার পরিমাণ রিয়েল টাইমে আপডেট করা হয়।
যদিও অ্যাগ্রিগেট এপিআই ব্যবহারকারীর সেট করা অগ্রাধিকার অনুযায়ী ডেটা ডিডুপ করে অ্যাক্টিভিটি এবং স্লিপ অ্যাপের ডেটা গণনা করে, তবুও আপনি ডেটা লেখা প্রতিটি অ্যাপের জন্য আলাদাভাবে ডেটা গণনা করার জন্য নিজস্ব লজিক তৈরি করতে পারেন।
হেলথ কানেক্ট শুধুমাত্র অ্যাক্টিভিটি এবং স্লিপ ডেটা টাইপগুলো থেকে ডুপ্লিকেট ডেটা অপসারণ করে, এবং প্রদর্শিত ডেটার মোট পরিমাণ হলো অ্যাগ্রিগেট এপিআই দ্বারা ডুপ্লিকেট ডেটা অপসারণের পরের মান। এই মোট পরিমাণগুলো সর্বশেষ পূর্ণ দিনের পদক্ষেপ এবং দূরত্বের ডেটা দেখায়। অন্যান্য ধরনের ডেটার ক্ষেত্রে, অ্যাগ্রিগেটেড ফলাফলগুলো হেলথ কানেক্টে থাকা সেই সমস্ত অ্যাপের ডেটা একত্রিত করে, যে অ্যাপগুলো থেকে ডেটাটি লেখা হয়েছে।
পটভূমি পাঠ
আপনি আপনার অ্যাপ্লিকেশনকে ব্যাকগ্রাউন্ডে চলতে এবং হেলথ কানেক্ট থেকে ডেটা পড়তে অনুরোধ করতে পারেন। আপনি যদি ‘ব্যাকগ্রাউন্ড রিড’ অনুমতির জন্য অনুরোধ করেন, তাহলে আপনার ব্যবহারকারী আপনার অ্যাপকে ব্যাকগ্রাউন্ডে ডেটা পড়ার অ্যাক্সেস দিতে পারবেন।
রেকর্ড দ্বারা সমর্থিত সমষ্টিগত ডেটা প্রকার
এই সারণিতে হেলথ কানেক্ট রেকর্ড অনুযায়ী সমস্ত সমর্থিত অ্যাগ্রিগেট ডেটা টাইপের তালিকা দেওয়া হয়েছে।