এই নির্দেশিকা Health Connect-এর 1.1.0-alpha12 ভার্সনের সাথে মানানসই।
এই নির্দেশিকায় Health Connect-এ ডেটা লেখা বা আপডেট করার প্রসেস সম্পর্কে বলা হয়েছে।
শূন্য ভ্যালু ম্যানেজ করা
পদক্ষেপ, দূরত্ব বা ক্যালোরির মতো কিছু ডেটার ধরন 0 ভ্যালু দেখাতে পারে।
ব্যবহারকারী ডিভাইসটি
পরিধান করার সময় প্রকৃত নিষ্ক্রিয়তা প্রতিফলিত হলে তবেই শূন্য মান লিখুন। ডিভাইস না পরলে, ডেটা
মিসিং থাকলে বা ব্যাটারি শেষ হয়ে গেলে, শূন্য মান লিখবেন না। এইসব ক্ষেত্রে, বিভ্রান্তিকর
ডেটা এড়াতে রেকর্ড বাদ দিন।
ডেটা স্ট্রাকচার সেট-আপ করা
ডেটা লেখার আগে, আমাদের প্রথমে রেকর্ড সেট-আপ করতে হবে। ৫০টির বেশি ডেটা টাইপের জন্য, প্রত্যেকটির নিজস্ব গঠন আছে। উপলভ্য ডেটার ধরন সম্পর্কে আরও বিবরণের জন্য Jetpack রেফারেন্স দেখুন।
প্রাথমিক রেকর্ড
Health Connect-এ ধাপ ডেটা ধরন, রিডিংয়ের মধ্যে কোনও ব্যবহারকারী কতগুলি ধাপ হেঁটেছেন তা ক্যাপচার করে। স্বাস্থ্য, ফিটনেস ও সুস্থতা সংক্রান্ত প্ল্যাটফর্ম জুড়ে ধাপে ধাপে গণনা একটি সাধারণ পরিমাপের প্রতিনিধিত্ব করে।
নিচের উদাহরণ থেকে কীভাবে ধাপ গণনা সংক্রান্ত ডেটা সেট করতে হয় তা জানতে পারবেন:
val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime) val stepsRecord = StepsRecord( count = 120, startTime = startTime, endTime = endTime, startZoneOffset = zoneOffset, endZoneOffset = zoneOffset, metadata = Metadata.autoRecorded( device = Device(type = Device.TYPE_WATCH) ) ) healthConnectClient.insertRecords(listOf(stepsRecord))
পরিমাপের একক সহ রেকর্ড
সঠিক তথ্য প্রদান করতে Health Connect পরিমাপের একক সহ ভ্যালু স্টোর করতে পারে। একটি উদাহরণ হল পুষ্টি ডেটার ধরন যা অনেক বড় এবং ব্যাপক। এতে মোট কার্বোহাইড্রেট থেকে ভিটামিন পর্যন্ত বিভিন্ন ধরনের ঐচ্ছিক পুষ্টি উপাদান ফিল্ড অন্তর্ভুক্ত থাকে। প্রতিটি ডেটা পয়েন্ট সেইসব পুষ্টি উপাদানকে প্রতিনিধিত্ব করে যা কোনও খাবার বা খাদ্য আইটেমের অংশ হিসেবে সম্ভাব্য গ্রহণ করা হয়েছে।
এই ডেটা টাইপে, সব পুষ্টি উপাদানকে
ওজন-এর একক হিসেবে দেখানো হয়, যেখানে 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.activelyRecorded( 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.activelyRecorded( device = Device(type = Device.TYPE_WATCH) ))
ব্যবহারকারীর থেকে অনুমতি চাওয়া
ক্লায়েন্ট ইনস্ট্যান্স তৈরি করার পরে, আপনার অ্যাপকে ব্যবহারকারীর কাছে অনুমতি চেয়ে অনুরোধ করতে হবে। ব্যবহারকারীদের যেকোনও সময় অনুমতি দেওয়া বা প্রত্যাহার করার সুবিধা দিতে হবে। এটি করতে, প্রয়োজনীয় ডেটার ধরনের জন্য অনুমতির একটি সেট তৈরি করুন। সেটে থাকা অনুমতিগুলি প্রথমে আপনার Android মেনিফেস্টে ঘোষণা করা হয়েছে কিনা তা ভালো করে দেখে নিন।
val permissions = setOf( HealthPermission.getReadPermission(HeartRateRecord::class), HealthPermission.getWritePermission(HeartRateRecord::class), HealthPermission.getReadPermission(StepsRecord::class), HealthPermission.getWritePermission(StepsRecord::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.") } } }
ডেটা এডিট করা
Health Connect-এর একটি সাধারণ ওয়ার্কফ্লো হল ডেটা লেখা। রেকর্ড যোগ করতে,
insertRecords ব্যবহার করুন।
নিচের উদাহরণে দেখানো হয়েছে কীভাবে ডেটা লিখতে হয় এবং তার মধ্যে কতগুলি ধাপ অন্তর্ভুক্ত থাকে:
val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime) val stepsRecord = StepsRecord( count = 120, startTime = startTime, endTime = endTime, startZoneOffset = zoneOffset, endZoneOffset = zoneOffset, metadata = Metadata.autoRecorded( device = Device(type = Device.TYPE_WATCH) ) ) healthConnectClient.insertRecords(listOf(stepsRecord))
ডেটা আপডেট করা
আপনি যদি এক বা একাধিক রেকর্ড পরিবর্তন করতে চান, বিশেষ করে যখন আপনাকে Health Connect থেকে পাওয়া ডেটার সাথে আপনার অ্যাপ ডেটা স্টোর সিঙ্ক করতে হয়, তখন আপনি নিজের ডেটা আপডেট করতে পারবেন। আগে থেকে থাকা ডেটা আপডেট করার দুটি উপায় আছে, এটি রেকর্ড খোঁজার জন্য ব্যবহৃত আইডেন্টিফায়ারের উপর নির্ভর করে।
মেটাডেটা
Metadata ক্লাসটি প্রথমে পরীক্ষা করে দেখা ভাল, কারণ ডেটা আপডেট করার সময় এটি প্রয়োজন হয়।
তৈরি করার সময়, Health Connect-এ প্রতিটি Record-এ একটি
metadata ফিল্ড থাকে। সিঙ্ক্রোনাইজেশনের জন্য নিম্নলিখিত প্রপার্টি প্রাসঙ্গিক:
| প্রপার্টি | বর্ণনা |
|---|---|
id
|
Health Connect-এ প্রতিটি Record-এর একটি অনন্য id
ভ্যালু থাকে।নতুন রেকর্ড যোগ করার সময় Health Connect এটি অটোমেটিক পপুলেট করে। |
lastModifiedTime
|
এছাড়াও, প্রতিটি Record রেকর্ড শেষবার কবে পরিবর্তন করা হয়েছে তার ট্র্যাক রাখে।
Health Connect এটি অটোমেটিক পপুলেট করে। |
clientRecordId
|
আপনার অ্যাপ ডেটা স্টোরে রেফারেন্স হিসেবে কাজ করার জন্য প্রতিটি Record-এর সাথে
একটি অনন্য আইডি যুক্ত থাকতে পারে।
আপনার অ্যাপ এই ভ্যালু প্রদান করে। |
clientRecordVersion
|
যেখানে রেকর্ডে clientRecordId আছে, সেখানে
clientRecordVersion ব্যবহার করে ডেটাকে
আপনার অ্যাপের ভার্সনের সাথে সিঙ্ক করে রাখা
যায়।আপনার অ্যাপ এই ভ্যালু প্রদান করে। |
সময়সীমা অনুযায়ী পড়ার পরে আপডেট করা
ডেটা আপডেট করতে, প্রথমে প্রয়োজনীয় রেকর্ড প্রস্তুত করুন। প্রয়োজন হলে রেকর্ডগুলিতে
যেকোনও পরিবর্তন করুন। তারপর, পরিবর্তন করতে updateRecords-এ কল করুন।
নিচের উদাহরণ থেকে কীভাবে ডেটা আপডেট করতে হয় তা জানুন। এই উদ্দেশ্যে, প্রতিটি রেকর্ড -এর জোন অফসেট ভ্যালু PST-তে অ্যাডজাস্ট করা হয়েছে।
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 ফাংশনের ডেটা আপসার্ট করার ক্ষমতা আছে।
প্রদত্ত ক্লায়েন্ট রেকর্ড আইডির সেটের উপর ভিত্তি করে Health Connect-এ ডেটা থাকলে, সেটি ওভাররাইট হয়ে যায়। অন্যথায়, এটি নতুন ডেটা হিসেবে লেখা হয়।
আপনার অ্যাপ ডেটা স্টোর থেকে Health Connect-এ ডেটা সিঙ্ক করার প্রয়োজন হলে এই পরিস্থিতি কাজে লাগে।
অ্যাপ ডেটা স্টোর থেকে পাওয়া ডেটা আপসার্ট করার পদ্ধতি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
fun pullStepsFromDatastore(startTime: Instant, endTime: Instant) : 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.activelyRecorded( clientRecordId = "Your client record ID", clientRecordVersion = 0L, device = Device(type = Device.TYPE_WATCH) ), startTime = startTime, startZoneOffset = startTime.atZone(ZoneId.of("PST")).offset, endTime = endTime, endZoneOffset = endTime.atZone(ZoneId.of("PST")).offset, count = 120 ) 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( startTime = startTime, endTime = endTime ))
ক্লায়েন্ট রেকর্ড ভার্সনে ভ্যালু চেক করা
ডেটা আপসার্ট করার প্রসেসে ক্লায়েন্ট রেকর্ড ভার্সন থাকলে, 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.activelyRecorded( clientRecordId = "Your supplied record ID", clientRecordVersion = 0L, // Your supplied record version device = Device(type = Device.TYPE_WATCH) ) )
পরিবর্তন হলে, আপসার্ট অটোমেটিক version বাড়ায় না,
এর ফলে ডেটা ওভাররাইট করার অপ্রত্যাশিত ঘটনা এড়ানো যায়। এর সাথে, আপনাকে
ম্যানুয়ালি একটি বেশি ভ্যালু সাপ্লাই করতে হবে।
সাধারণ নির্দেশিকা
আপনার অ্যাপকে সব কাজ করে এমন ফার্স্ট-পার্টি ডেটা লিখতে হবে। বিকল্প হিসেবে, আপনি থার্ড-পার্টি সোর্স থেকে পাওয়া ডেটা আপনার অ্যাপে লেখার বিকল্প বেছে নিতে পারেন। তবে, আপনার অ্যাপ Health Connect থেকে ডেটা রিড করে থাকলে, সেই ডেটা Health Connect-এ আবার লেখা উচিত নয়।
অন্য সোর্স থেকে ইমপোর্ট করা বা পাওয়া ডেটা লেখার সময়, আপনাকে সেটির উৎস এবং সোর্স ডিভাইস মেটাডেটা সঠিকভাবে অ্যাট্রিবিউট করতে হবে। এটি করতে, আপনাকে প্রতিটি লিখিত রেকর্ডের জন্য নিম্নলিখিত মেটাডেটা প্রদান করতে হবে:
recordingMethod: অটোমেটিক বা ম্যানুয়ালি রেকর্ড করা ডেটার ক্ষেত্রে, আমরা আশা করি যে রেকর্ড করার পদ্ধতি আপডেট করা হবে যাতে রেকর্ড করা অ্যাক্টিভিটির ধরন বোঝা যায়:RECORDING_METHOD_AUTOMATICALLY_RECORDED: ডেটা যদি অটোমেটিক রেকর্ড করা হয়ে থাকে, যেমন, ফিটনেস ব্যান্ড অটোমেটিক শনাক্ত করেছে যে ব্যবহারকারী দৌড়াতে গেছেন।RECORDING_METHOD_ACTIVELY_RECORDED: ব্যবহারকারী যদি নতুন অ্যাক্টিভিটি শুরু করেন, যেমন, তার পরিধানযোগ্য ডিভাইসে বাইক চালানো।RECORDING_METHOD_MANUAL_ENTRY: ব্যবহারকারী ম্যানুয়ালি ডেটা লিখলে।
device.type: আপনাকে কাজ করে এমনDeviceধরনের মধ্যে থেকে একটি ডিভাইসের ধরন উল্লেখ করতে হবে।device.manufacturer: ডিভাইসের প্রস্তুতকারক, যেমন, "Fitbit"।device.model: ডিভাইসের মডেল, যেমন, "Charge 3"।device.udi: (ঐচ্ছিক) মেডিকেল ডিভাইসের অনন্য ডিভাইস শনাক্তকারী (UDI)-এর ডিভাইস শনাক্তকারী (DI) অংশ। প্রয়োজনীয় অনুমতি ও গোপনীয়তা নির্দেশিকা সম্পর্কে বিস্তারিত জানতে, মেটাডেটা নির্দেশিকা দেখুন।
ডেটা স্বচ্ছতার জন্য সঠিকভাবে মেটাডেটা সেট করা অত্যন্ত গুরুত্বপূর্ণ এবং এটি ব্যবহারকারীদের বুঝতে সাহায্য করে যে তাদের স্বাস্থ্য সংক্রান্ত তথ্য কোথা থেকে আসে। সম্পূর্ণ বিবরণের জন্য, Health Connect মেটাডেটা নির্দেশিকা দেখুন।
আপনার অ্যাপের ডেটা অন্য কোনও অ্যাপ থেকে ইমপোর্ট করা হলে, Health Connect-এ সেই অ্যাপের ডেটা লেখার দায়িত্ব অন্য অ্যাপের।
এছাড়াও, ডেটা রেঞ্জের বাইরে থাকা বা ইন্টার্নাল সিস্টেমের সমস্যার মতো লেখার ব্যতিক্রমগুলি পরিচালনা করে এমন যুক্তি প্রয়োগ করা ভাল। আপনি জব শিডিউলিং মেকানিজমের উপর ব্যাকঅফ ও আবার চেষ্টা করার কৌশল প্রয়োগ করতে পারবেন। Health Connect-এ ডেটা লেখা না গেলে, আপনার অ্যাপ যাতে এক্সপোর্ট প্রক্রিয়াটি সম্পূর্ণ করতে পারে তা নিশ্চিত করুন। রোগ নির্ণয়ের জন্য লগ করতে ও সমস্যার ব্যাপারে জানাতে ভুলবেন না।
ডেটা ট্র্যাক করার সময়, আপনার অ্যাপ যেভাবে ডেটা লেখে তার উপর নির্ভর করে আপনি কয়েকটি পরামর্শ অনুসরণ করতে পারেন।
টাইম জোন ম্যানেজ করা
সময়-ভিত্তিক রেকর্ড লেখার সময়, ডিফল্ট হিসেবে zoneOffset.UTC
অফসেট সেট করা এড়িয়ে চলুন কারণ ব্যবহারকারীরা অন্য
জোনে থাকলে এর ফলে ভুল টাইমস্ট্যাম্প তৈরি হতে পারে। এর পরিবর্তে, ডিভাইসের আসল
লোকেশন অনুযায়ী অফসেট হিসেব করুন। আপনি
ZoneId.systemDefault() ব্যবহার করে ডিভাইসের টাইম জোন রিট্রিভ করতে পারবেন।
val endTime = Instant.now() val startTime = endTime.minus(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(Duration.ofMinutes(minutesBetweenSamples)), startZoneOffset = zoneOffset, endTime = sampleTime, endZoneOffset = zoneOffset, count = Random.nextLong(1, 100), metadata = Metadata.activelyRecorded(device = Device(type = Device.TYPE_WATCH)), ) sampleTime = sampleTime.plus(Duration.ofMinutes(minutesBetweenSamples)) } healthConnectClient.insertRecords( stepsRecords )
আরও বিবরণের জন্য ZoneId-এর ডকুমেন্টেশন দেখুন।
ফ্রিকোয়েন্সি ও গ্র্যানুলারিটি লেখো
Health Connect-এ ডেটা লেখার সময়, উপযুক্ত রেজোলিউশন ব্যবহার করুন। সঠিক রেজোলিউশন ব্যবহার করলে স্টোরেজের উপর চাপ কমে যায়, একই সাথে ধারাবাহিক ও সঠিক ডেটা বজায় থাকে। ডেটা রেজোলিউশনের মধ্যে দুটি বিষয় অন্তর্ভুক্ত:
- রাইট করার ফ্রিকোয়েন্সি: আপনার অ্যাপ্লিকেশন কত ঘনঘন Health Connect-এ
নতুন ডেটা রাইট করে।
- নতুন ডেটা উপলভ্য হলে, ডিভাইস পারফর্ম্যান্সের কথা মাথায় রেখে যত ঘন ঘন সম্ভব ডেটা লিখুন।
- ব্যাটারি লাইফ ও অন্যান্য পারফর্ম্যান্সের উপর নেতিবাচক প্রভাব এড়াতে, দু'টি রাইটের মধ্যে সর্বাধিক ১৫ মিনিট বিরতি থাকা উচিত।
- লিখিত ডেটার গ্র্যানুলারিটি: কত ঘন ঘন ডেটা স্যাম্পেল করা হয়েছে।
- যেমন, প্রতি ৫ সেকেন্ড অন্তর হার্ট রেট স্যাম্পেল লেখা।
- সব ডেটা টাইপের জন্য একই স্যাম্পেল রেট প্রয়োজন হয় না। প্রতি ৬০ সেকেন্ডের মতো কম ফ্রিকোয়েন্সির পরিবর্তে প্রতি সেকেন্ডে ধাপের সংখ্যা সংক্রান্ত ডেটা আপডেট করার খুব কম সুবিধা রয়েছে।
- স্যাম্পেল রেট বেশি হলে, ব্যবহারকারীরা তাদের স্বাস্থ্য ও ফিটনেস ডেটা আরও বিস্তারিত ও সূক্ষ্মভাবে দেখতে পাবেন। স্যাম্পেল রেট ফ্রিকোয়েন্সি বিস্তারিত বিবরণ ও পারফর্ম্যান্সের মধ্যে ভারসাম্য বজায় রাখতে হবে।
অতিরিক্ত নির্দেশিকা:
ডেটা লেখার সময় এইসব নির্দেশিকা মেনে চলুন:
- প্রতিটি সিঙ্কে, শুধুমাত্র নতুন ডেটা এবং আপডেট করা ডেটা লিখুন যা শেষ সিঙ্ক করার পর থেকে পরিবর্তন করা হয়েছে।
- প্রতিটি লেখার অনুরোধে সর্বাধিক ১০০০টি রেকর্ড করে অনুরোধকে ভাগ করুন।
- ডিভাইস অলস থাকলে এবং ব্যাটারির চার্জ কম না থাকলে তবেই টাস্ক রান করার অনুমতি দিন।
- ব্যাকগ্রাউন্ড টাস্কের জন্য, সর্বাধিক ১৫ মিনিটের সময়সীমা সহ, পর্যায়ক্রমিক টাস্ক শিডিউল করতে WorkManager ব্যবহার করুন।
নিচের কোডটি ১৫ মিনিটের সর্বাধিক সময়সীমা এবং ৫ মিনিটের ফ্লেক্স ইন্টারভ্যাল সহ, পর্যায়ক্রমিক ব্যাকগ্রাউন্ড টাস্ক শিডিউল করতে WorkManager ব্যবহার করে।
এই
কনফিগারেশনটি
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-এ ডেটা লেখার সময়, উপযুক্ত রেজোলিউশন ব্যবহার করুন। সঠিক রেজোলিউশন ব্যবহার করলে স্টোরেজের উপর চাপ কমে যায়, একই সাথে ধারাবাহিক ও সঠিক ডেটা বজায় থাকে। ডেটা রেজোলিউশনে ২টি বিষয় অন্তর্ভুক্ত থাকে:
রাইট করার ফ্রিকোয়েন্সি: আপনার অ্যাপ্লিকেশন কত ঘন ঘন Health Connect-এ নতুন ডেটা পুশ করে। নতুন ডেটা উপলভ্য হলে যত ঘন ঘন সম্ভব ডেটা লিখুন, তবে ডিভাইসের পারফর্ম্যান্সের দিকে খেয়াল রাখবেন। ব্যাটারির আয়ু ও অন্যান্য পারফর্ম্যান্সের উপর নেতিবাচক প্রভাব এড়াতে, দু'টি রাইটের মধ্যে সর্বাধিক বিরতি ১৫ মিনিট হতে হবে।
লিখিত ডেটার গ্র্যানুলারিটি: পুশ করা ডেটা কত ঘন ঘন স্যাম্পেল করা হয়। যেমন, প্রতি ৫ সেকেন্ড অন্তর হার্ট রেট স্যাম্পেল লিখুন। প্রতিটি ডেটার ধরন একই স্যাম্পেল রেট প্রয়োজন হয় না। প্রতি ৬০ সেকেন্ডের মতো কম ঘন ঘন ক্যাডেন্সের পরিবর্তে প্রতি সেকেন্ডে স্টেপ কাউন্ট ডেটা আপডেট করার খুব কম সুবিধা রয়েছে। তবে, বেশি নমুনা রেট ব্যবহারকারীদের স্বাস্থ্য ও ফিটনেস ডেটা আরও বিস্তারিত ও গ্র্যানুলারভাবে দেখতে সাহায্য করতে পারে। স্যাম্পেল রেট ফ্রিকোয়েন্সি বিস্তারিত বিবরণ ও পারফর্ম্যান্সের মধ্যে ভারসাম্য বজায় রাখতে হবে।
সিরিজ ডেটার জন্য রেকর্ড স্ট্রাকচার করা
HeartRateRecord-এর মতো নমুনা সিরিজ ব্যবহার করে এমন ডেটা ধরনের জন্য, আপনার রেকর্ড সঠিকভাবে স্ট্রাকচার করা
গুরুত্বপূর্ণ। সারাদিনের জন্য একটি,
একক রেকর্ড তৈরি না করে, আপনাকে একাধিক ছোট ছোট
রেকর্ড তৈরি করতে হবে, যার প্রতিটি একটি নির্দিষ্ট সময়সীমাকে প্রতিনিধিত্ব করবে।
যেমন, হার্ট রেট ডেটার জন্য, আপনাকে প্রতি মিনিটের জন্য
নতুন HeartRateRecord তৈরি করতে হবে। প্রতিটি রেকর্ডে সেই
মিনিট ধরে শুরু ও শেষ হওয়ার সময় থাকবে এবং সেই
মিনিটে ক্যাপচার করা হার্ট রেট সংক্রান্ত সব নমুনা থাকবে।
Health Connect-এর সাথে নিয়মিত সিঙ্ক করার সময় (যেমন, প্রতি ১৫ মিনিট অন্তর), আপনার অ্যাপকে আগের সিঙ্কের পর থেকে তৈরি হওয়া সব এক-মিনিটের রেকর্ড লিখতে হবে। এর ফলে রেকর্ড ম্যানেজ করা যায় এবং কোয়েরি ও ডেটা প্রসেস করার পারফর্ম্যান্স উন্নত হয়।
নিম্নলিখিত উদাহরণে দেখানো হয়েছে কীভাবে একাধিক স্যাম্পেল সহ
এক মিনিটের HeartRateRecord তৈরি করতে হয়:
val startTime = Instant.now().truncatedTo(ChronoUnit.MINUTES) val endTime = startTime.plus(Duration.ofMinutes(1)) val heartRateRecord = HeartRateRecord( startTime = startTime, startZoneOffset = ZoneOffset.UTC, endTime = endTime, endZoneOffset = ZoneOffset.UTC, // Create a new record every minute, containing a list of samples. samples = listOf( HeartRateRecord.Sample( time = startTime + Duration.ofSeconds(15), beatsPerMinute = 80, ), HeartRateRecord.Sample( time = startTime + Duration.ofSeconds(30), beatsPerMinute = 82, ), HeartRateRecord.Sample( time = startTime + Duration.ofSeconds(45), beatsPerMinute = 85, ) ), metadata = Metadata.activelyRecorded( device = Device(type = Device.TYPE_WATCH) ))
সারাদিন ধরে মনিটর করা ডেটা লেখা
স্টেপের মতো ক্রমাগত সংগ্রহ করা ডেটার জন্য, নতুন ডেটা উপলভ্য হলে আপনার অ্যাপ্লিকেশনকে যত ঘন ঘন সম্ভব Health Connect-এ লিখতে হবে। ব্যাটারির আয়ু ও অন্যান্য পারফর্ম্যান্সের উপর নেতিবাচক প্রভাব এড়াতে, দুটি রাইটের মধ্যে সর্বাধিক ১৫ মিনিট বিরতি থাকতে হবে।
ডেটার ধরন |
ইউনিট |
প্রত্যাশিত |
উদাহরণ |
ধাপ |
পা ফেলা |
প্রতি ১ মিনিটে |
২৩:১৪ - ২৩:১৫ - ৫টি ধাপ ২৩:১৬ - ২৩:১৭ - ২২টি ধাপ ২৩:১৭ - ২৩:১৮ - ৮টি ধাপ |
StepsCadence |
পা ফেলা/মিনিট |
প্রতি ১ মিনিটে |
২৩:১৪ - ২৩:১৫ - ৫ spm ২৩:১৬ - ২৩:১৭ - ২২ spm ২৩:১৭ - ২৩:১৮ - ৮ spm |
হুইলচেয়ার পুশ করা সংক্রান্ত ডেটা |
পুশ করা |
প্রতি ১ মিনিটে |
২৩:১৪ - ২৩:১৫ - ৫টি পুশ ২৩:১৬ - ২৩:১৭ - ২২টি পুশ ২৩:১৭ - ২৩:১৮ - ৮টি পুশ |
ActiveCaloriesBurned |
ক্যালরি |
প্রতি ১৫ মিনিটে |
২৩:১৫ - ২৩:৩০ - ২ ক্যালোরি ২৩:৩০ - ২৩:৪৫ - ২৫ ক্যালোরি ২৩:৪৫ - ০০:০০ - ৫ ক্যালোরি |
TotalCaloriesBurned |
ক্যালরি |
প্রতি ১৫ মিনিটে |
২৩:১৫ - ২৩:৩০ - ১৬ ক্যালোরি ২৩:৩০ - ২৩:৪৫ - ১৬ ক্যালোরি ২৩:৪৫ - ০০:০০ - ১৬ ক্যালোরি |
দূরত্ব |
কিমি/মিনিট |
প্রতি ১ মিনিটে |
২৩:১৪-২৩:১৫ - ০.০০৮ কিমি ২৩:১৬ - ২৩:১৬ - ০.০২১ কিমি ২৩:১৭ - ২৩:১৮ - ০.০১২ কিমি |
উচ্চতা বৃদ্ধি সংক্রান্ত ডেটা |
মি |
প্রতি ১ মিনিটে |
২০:৩৬ - ২০:৩৭ - ৩.০৪৮মি ২০:৩৯ - ২০:৪০ - ৩.০৪৮মি ২৩:২৩ - ২৩:২৪ - ৯.১৪৪মি |
কত তলা উঠেছেন তার ডেটা |
ফ্লোর |
প্রতি ১ মিনিটে |
২৩:১৪ - ২৩:১৫ - ৫টি ফ্লোর ২৩:১৬ - ২৩:১৬ - ২২ তলা ২৩:১৭ - ২৩:১৮ - ৮ তলা |
HeartRate |
BPM |
মিনিটে ৪ বার |
৬:১১:১৫am - ৫৫ bpm ৬:১১:৩০am - 56 bpm ৬:১১:৪৫ am - ৫৬ bpm ৬:১২:০০ am - 55 bpm |
HeartRateVariabilityRmssd |
ms |
প্রতি ১ মিনিটে |
৬:১১am - ২৩ ms |
RespiratoryRate |
শ্বাস/মিনিট |
প্রতি ১ মিনিটে |
২৩:১৪ - ২৩:১৫ - ৬০ বার শ্বাস/মিনিট ২৩:১৬ - ২৩:১৬ - ৬২ বার শ্বাস/মিনিট ২৩:১৭ - ২৩:১৮ - ৬৪ বার শ্বাস/মিনিট |
OxygenSaturation |
% |
প্রতি ১ ঘণ্টায় |
৬:১১ - ৯৫.২০৮% |
ওয়ার্কআউট বা ঘুম সেশনের শেষে Health Connect-এ ডেটা লেখা উচিত। অ্যাক্টিভ ট্র্যাকিংয়ের জন্য, যেমন ব্যায়াম এবং ঘুম অথবা ম্যানুয়াল ব্যবহারকারীর ইনপুট যেমন পুষ্টি, অ্যাপটি ফোরগ্রাউন্ডে থাকলে বা বিরল ইভেন্টে যেখানে এটি দিনে কয়েকবার ব্যবহার করা হয়, তখন এই রেকর্ড তৈরি করা হয়।
যাচাই করে দেখুন যে আপনার অ্যাপ ইভেন্টের সম্পূর্ণ সময়সীমা ধরে Health Connect চালু রাখে না।
দুটি উপায়ের মধ্যে একটি উপায়ে Health Connect-এ ডেটা লিখতে হবে:
- ইভেন্ট সম্পূর্ণ হওয়ার পরে Health Connect-এ ডেটা সিঙ্ক করুন। যেমন, ব্যবহারকারী ট্র্যাক করা ব্যায়াম সেশন শেষ করলে ডেটা সিঙ্ক করুন।
- পরে ডেটা সিঙ্ক করার জন্য WorkManager ব্যবহার করে একবারের টাস্ক শিডিউল করুন।
ব্যায়াম ও ঘুমের সেশন
কমপক্ষে, আপনার অ্যাপ্লিকেশনকে সারণী ২-এর প্রত্যাশিত কলামে দেওয়া নির্দেশিকা মেনে চলতে হবে। যেখানে সম্ভব, সেরা কলামে দেওয়া নির্দেশিকা অনুসরণ করুন।
নিচের সারণী থেকে জানতে পারবেন যে ব্যায়াম করার সময় কীভাবে ডেটা লিখতে হয়:
ডেটার ধরন |
ইউনিট |
প্রত্যাশিত |
ভালো থাকবেন |
উদাহরণ |
ধাপ |
পা ফেলা |
প্রতি ১ মিনিটে |
প্রতি ১ সেকেন্ডে |
২৩:১৪-২৩:১৫ - ৫টি ধাপ ২৩:১৬ - ২৩:১৭ - ২২টি ধাপ ২৩:১৭ - ২৩:১৮ - ৮টি ধাপ |
StepsCadence |
পা ফেলা/মিনিট |
প্রতি ১ মিনিটে |
প্রতি ১ সেকেন্ডে |
২৩:১৪-২৩:১৫ - ৩৫ spm ২৩:১৬ - ২৩:১৭ - ৩৭ spm ২৩:১৭ - ২৩:১৮ - ৪০ spm |
হুইলচেয়ার পুশ করা সংক্রান্ত ডেটা |
পুশ করা |
প্রতি ১ মিনিটে |
প্রতি ১ সেকেন্ডে |
২৩:১৪-২৩:১৫ - ৫টি পুশ ২৩:১৬ - ২৩:১৭ - ২২টি পুশ ২৩:১৭ - ২৩:১৮ - ৮টি পুশ |
CyclingPedalingCadence |
rpm |
প্রতি ১ মিনিটে |
প্রতি ১ সেকেন্ডে |
২৩:১৪-২৩:১৫ - ৬৫ rpm ২৩:১৬ - ২৩:১৭ - ৭০ rpm ২৩:১৭ - ২৩:১৮ - ৬৮ rpm |
বিদ্যুৎ |
ওয়াট |
প্রতি ১ মিনিটে |
প্রতি ১ সেকেন্ডে |
২৩:১৪-২৩:১৫ - ২৫০ ওয়াট ২৩:১৬ - ২৩:১৭ - ২৫৫ ওয়াট ২৩:১৭ - ২৩:১৮ - ২৪৫ ওয়াট |
গতি |
কিমি/মিনিট |
প্রতি ১ মিনিটে |
প্রতি ১ সেকেন্ডে |
২৩:১৪-২৩:১৫ - ০.৩ কিমি/মিনিট ২৩:১৬ - ২৩:১৭ - ০.৪ কিমি/মিনিট ২৩:১৭ - ২৩:১৮ -০.৪ কিমি/মিনিট |
দূরত্ব |
কিমি/মিনিট |
প্রতি ১ মিনিটে |
প্রতি ১ সেকেন্ডে |
২৩:১৪-২৩:১৫ - ০.০০৮ কিমি ২৩:১৬ - ২৩:১৬ - ০.০২১ কিমি ২৩:১৭ - ২৩:১৮ - ০.০১২ কিমি |
ActiveCaloriesBurned |
ক্যালরি |
প্রতি ১ মিনিটে |
প্রতি ১ সেকেন্ডে |
২৩:১৪-২৩:১৫ - ২০ ক্যালোরি ২৩:১৬ - ২৩:১৭ - ২০ ক্যালোরি ২৩:১৭ - ২৩:১৮ - ২৫ ক্যালোরি |
TotalCaloriesBurned |
ক্যালরি |
প্রতি ১ মিনিটে |
প্রতি ১ সেকেন্ডে |
২৩:১৪-২৩:১৫ - ৩৬ ক্যালোরি ২৩:১৬ - ২৩:১৭ - ৩৬ ক্যালোরি ২৩:১৭ - ২৩:১৮ - ৪১ ক্যালোরি |
উচ্চতা বৃদ্ধি সংক্রান্ত ডেটা |
মি |
প্রতি ১ মিনিটে |
প্রতি ১ সেকেন্ডে |
২০:৩৬ - ২০:৩৭ - ৩.০৪৮মি ২০:৩৯ - ২০:৪০ - ৩.০৪৮মি ২৩:২৩ - ২৩:২৪ - ৯.১৪৪মি |
ExerciseRoutes |
অক্ষাংশ/দ্রাঘিমাংশ/উচ্চতা |
প্রতি ৩-৫ সেকেন্ডে |
প্রতি ১ সেকেন্ডে |
|
HeartRate |
BPM |
মিনিটে ৪ বার |
প্রতি ১ সেকেন্ডে |
২৩:১৪-২৩:১৫ - ১৫০ bpm |
ঘুমের সেশন চলাকালীন বা পরে কীভাবে ডেটা লিখতে হয় তা সারণী ৩-এ দেখানো হয়েছে:
ডেটার ধরন |
ইউনিট |
প্রত্যাশিত স্যাম্পেল |
উদাহরণ |
স্লিপ স্টেজিং |
স্টেজ |
ঘুমের প্রতিটি পর্যায়ের জন্য গ্র্যানুলার সময়সীমা |
২৩:৪৬ - ২৩:৫০ - জেগে ছিলেন ২৩:৫০ - ২৩:৫৬ - হালকা ঘুম ২৩:৫৬ - ০০:১৬ - গভীর ঘুম |
বিশ্রামকালীন হার্ট রেট |
BPM |
একক দৈনিক ভ্যালু (সকালে প্রথমবার) |
৬:১১am - 60 bpm |
OxygenSaturation |
% |
একক দৈনিক ভ্যালু (সকালে প্রথমবার) |
৬:১১ - ৯৫.২০৮% |
মাল্টি-স্পোর্ট ইভেন্ট
এই পদ্ধতিতে আগে থেকে থাকা ডেটার ধরন ও স্ট্রাকচার ব্যবহার করা হয় এবং এটি বর্তমান Health Connect ইমপ্লিমেন্টেশন ও ডেটা রিডারদের সাথে কম্প্যাটিবিলিটি যাচাই করে। ফিটনেস প্ল্যাটফর্মের ক্ষেত্রে এটি একটি সাধারণ পদ্ধতি।
এছাড়াও, সাঁতার, সাইকেল চালানো ও দৌড়ানোর মতো আলাদা আলাদা সেশন 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.activelyRecorded( device = Device(type = Device.TYPE_WATCH) ), startZoneOffset = null, endZoneOffset = null, ) val bikeSession = ExerciseSessionRecord( startTime = bikeStartTime, endTime = bikeEndTime, exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_BIKING, metadata = Metadata.activelyRecorded( device = Device(type = Device.TYPE_WATCH) ), startZoneOffset = null, endZoneOffset = null, ) val runSession = ExerciseSessionRecord( startTime = runStartTime, endTime = runEndTime, exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING, metadata = Metadata.activelyRecorded( device = Device(type = Device.TYPE_WATCH) ), startZoneOffset = null, endZoneOffset = null, ) healthConnectClient.insertRecords(listOf(swimSession, bikeSession, runSession))
ব্যতিক্রম ম্যানেজ করা
কোনও সমস্যা হলে Health Connect CRUD অপারেশনের জন্য স্ট্যান্ডার্ড ব্যতিক্রম ফেলে দেয়। আপনার অ্যাপকে এইসব ব্যতিক্রমের প্রতিটি যথাযথভাবে ধরতে ও হ্যান্ডেল করতে হবে।
HealthConnectClient-এর প্রতিটি পদ্ধতিতে ব্যতিক্রমের তালিকা দেওয়া আছে যা প্রয়োগ করা যেতে পারে।
সাধারণত, আপনার অ্যাপকে নিম্নলিখিত ব্যতিক্রমগুলি হ্যান্ডেল করতে হবে:
| ব্যতিক্রম | বিবরণ | সাজেস্ট করা পেশাদার পদ্ধতি |
|---|---|---|
IllegalStateException
| নিম্নলিখিত পরিস্থিতিগুলির মধ্যে কোনও একটি ঘটেছে:
| অনুরোধ করার আগে ইনপুট সংক্রান্ত সম্ভাব্য সমস্যার সমাধান করুন। ভাল হয়, আপনার অনুরোধে সরাসরি ব্যবহার না করে, কাস্টম ফাংশনের মধ্যে ভেরিয়েবলকে ভ্যালু অ্যাসাইন করুন বা প্যারামিটার হিসেবে ব্যবহার করুন, যাতে আপনি এরর হ্যান্ডেলিং স্ট্র্যাটেজি প্রয়োগ করতে পারেন। |
IOException
| ডিস্ক থেকে ডেটা রিড ও রাইট করার সময় সমস্যা হয়েছে। | এই সমস্যা এড়াতে, এখানে কিছু সাজেশন দেওয়া হল:
|
RemoteException
| SDK যে অন্তর্নিহিত পরিষেবার সাথে কানেক্ট করে, তার মধ্যে বা তার সাথে যোগাযোগ করার সময়
সমস্যা হয়েছে। যেমন, আপনার অ্যাপ প্রদত্ত uid সহ একটি রেকর্ড মুছে ফেলার চেষ্টা করছে। তবে, অ্যাপটি অন্তর্নিহিত পরিষেবা চেক করার পরে যখন জানতে পারে যে
রেকর্ডটি নেই, তখন ব্যতিক্রম
ঘটে।
| এই সমস্যা এড়াতে, এখানে কিছু সাজেশন দেওয়া হল:
|
SecurityException
| অনুরোধের জন্য মঞ্জুর করা হয়নি এমন অনুমতি প্রয়োজন হলে সমস্যা হয়। | এটি এড়াতে, আপনার প্রকাশিত অ্যাপের জন্য আপনি যে Health Connect ডেটা ধরনের ব্যবহার ঘোষণা করেছেন তা নিশ্চিত করুন। এছাড়াও, আপনাকে Health Connect-এর অনুমতি ম্যানিফেস্ট ফাইলে এবং আপনার অ্যাক্টিভিটিতে ঘোষণা করতে হবে। |