এই নির্দেশিকাটি Health Connect-এ ডেটা লেখা বা আপডেট করার প্রক্রিয়াটি কভার করে।
শূন্য মান পরিচালনা করুন
কিছু ডেটা টাইপ যেমন ধাপ, দূরত্ব, বা ক্যালোরির মান 0
হতে পারে। ব্যবহারকারী যখন ডিভাইসটি পরেছিলেন তখন প্রকৃত নিষ্ক্রিয়তা প্রতিফলিত হলে কেবল শূন্য মান লিখুন। ডিভাইসটি যদি না পরে থাকে, ডেটা অনুপস্থিত থাকে, বা ব্যাটারি মারা যায় তবে শূন্য মান লিখবেন না। এই ধরনের ক্ষেত্রে, বিভ্রান্তিকর ডেটা এড়াতে রেকর্ডটি বাদ দিন।
ডেটা স্ট্রাকচার সেট আপ করুন
ডেটা লেখার আগে, আমাদের প্রথমে রেকর্ড সেট আপ করতে হবে। ৫০ টিরও বেশি ডেটা টাইপের জন্য, প্রতিটির নিজস্ব কাঠামো রয়েছে। উপলব্ধ ডেটা টাইপ সম্পর্কে আরও বিস্তারিত জানার জন্য জেটপ্যাক রেফারেন্স দেখুন।
মৌলিক রেকর্ড
হেলথ কানেক্টের স্টেপস ডেটা টাইপ ব্যবহারকারীর দ্বারা রিডিংয়ের মধ্যে নেওয়া পদক্ষেপের সংখ্যা ক্যাপচার করে। স্বাস্থ্য, ফিটনেস এবং সুস্থতা প্ল্যাটফর্মগুলিতে ধাপের গণনা একটি সাধারণ পরিমাপের প্রতিনিধিত্ব করে।
নিম্নলিখিত উদাহরণে ধাপ গণনার ডেটা কীভাবে সেট করতে হয় তা দেখানো হয়েছে:
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)
)
)
পরিমাপের একক সহ রেকর্ড
হেলথ কানেক্ট সঠিকতা প্রদানের জন্য পরিমাপের এককের সাথে মান সংরক্ষণ করতে পারে। এর একটি উদাহরণ হল পুষ্টি ডেটা টাইপ যা বিশাল এবং বিস্তৃত। এতে মোট কার্বোহাইড্রেট থেকে শুরু করে ভিটামিন পর্যন্ত বিভিন্ন ধরণের ঐচ্ছিক পুষ্টির ক্ষেত্র অন্তর্ভুক্ত রয়েছে। প্রতিটি ডেটা পয়েন্ট সেই পুষ্টিগুলিকে প্রতিনিধিত্ব করে যা সম্ভাব্যভাবে খাবার বা খাদ্য আইটেমের অংশ হিসাবে গ্রহণ করা হয়েছিল।
এই ডেটা টাইপে, সমস্ত পুষ্টি উপাদান ভরের একক দ্বারা উপস্থাপিত হয়, যেখানে 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)
)
)
সিরিজ ডেটা সহ রেকর্ডস
হেলথ কানেক্ট সিরিজ ডেটার একটি তালিকা সংরক্ষণ করতে পারে। এর একটি উদাহরণ হল হার্ট রেট ডেটা টাইপ যা রিডিংয়ের মধ্যে সনাক্ত করা হৃদস্পন্দনের নমুনার একটি সিরিজ ক্যাপচার করে।
এই ডেটা টাইপে, প্যারামিটার 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)
))
ব্যবহারকারীর কাছ থেকে অনুমতির অনুরোধ করুন
একটি ক্লায়েন্ট ইনস্ট্যান্স তৈরি করার পরে, আপনার অ্যাপটিকে ব্যবহারকারীর কাছ থেকে অনুমতি চাইতে হবে। ব্যবহারকারীদের যেকোনো সময় অনুমতি প্রদান বা অস্বীকার করার অনুমতি দিতে হবে।
এটি করার জন্য, প্রয়োজনীয় ডেটা টাইপের জন্য অনুমতিগুলির একটি সেট তৈরি করুন। নিশ্চিত করুন যে সেটের অনুমতিগুলি প্রথমে আপনার অ্যান্ড্রয়েড ম্যানিফেস্টে ঘোষণা করা হয়েছে।
// 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
}
}
ডেটা আপডেট করুন
যদি আপনার এক বা একাধিক রেকর্ড পরিবর্তন করার প্রয়োজন হয়, বিশেষ করে যখন আপনার অ্যাপ ডেটাস্টোরকে হেলথ কানেক্টের ডেটার সাথে সিঙ্ক করার প্রয়োজন হয়, তাহলে আপনি আপনার ডেটা আপডেট করতে পারেন। বিদ্যমান ডেটা আপডেট করার দুটি উপায় আছে যা রেকর্ড খুঁজে পেতে ব্যবহৃত শনাক্তকারীর উপর নির্ভর করে।
মেটাডেটা
ডেটা আপডেট করার সময় Metadata
ক্লাসটি প্রথমে পরীক্ষা করা মূল্যবান কারণ এটি প্রয়োজনীয়। তৈরির সময়, হেলথ কানেক্টের প্রতিটি Record
একটি metadata
ক্ষেত্র থাকে। নিম্নলিখিত বৈশিষ্ট্যগুলি সিঙ্ক্রোনাইজেশনের সাথে প্রাসঙ্গিক:
বৈশিষ্ট্য | বিবরণ |
---|---|
id | হেলথ কানেক্টের প্রতিটি Record একটি অনন্য id মান থাকে।নতুন রেকর্ড সন্নিবেশ করানোর সময় Health Connect স্বয়ংক্রিয়ভাবে এটি পূরণ করে । |
lastModifiedTime | প্রতিটি Record রেকর্ডটি শেষ কবে পরিবর্তন করা হয়েছিল তার হিসাব রাখে।হেলথ কানেক্ট স্বয়ংক্রিয়ভাবে এটি পূরণ করে। |
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
ফাংশনে ডেটা আপসার্ট করার ক্ষমতা রয়েছে। যদি ক্লায়েন্ট রেকর্ড আইডির প্রদত্ত সেটের উপর ভিত্তি করে হেলথ কানেক্টে ডেটা থাকে, তাহলে এটি ওভাররাইট হয়ে যায়। অন্যথায়, এটি নতুন ডেটা হিসাবে লেখা হয়। আপনার অ্যাপ ডেটাস্টোর থেকে হেলথ কানেক্টে ডেটা সিঙ্ক করার প্রয়োজন হলে এই পরিস্থিতি কার্যকর।
নিম্নলিখিত উদাহরণটি দেখায় যে অ্যাপ ডেটাস্টোর থেকে সংগৃহীত ডেটার উপর কীভাবে আপসার্ট করতে হয়:
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-এ লেখা শেষ পর্যন্ত ব্যর্থ হয়, তাহলে নিশ্চিত করুন যে আপনার অ্যাপটি রপ্তানির সেই বিন্দু অতিক্রম করতে পারে। রোগ নির্ণয়ে সহায়তা করার জন্য লগ এবং ত্রুটি রিপোর্ট করতে ভুলবেন না।
ডেটা ট্র্যাক করার সময়, আপনার অ্যাপ কীভাবে ডেটা লেখে তার উপর নির্ভর করে আপনি কয়েকটি পরামর্শ অনুসরণ করতে পারেন।
টাইম জোন হ্যান্ডলিং
সময়-ভিত্তিক রেকর্ড লেখার সময়, ডিফল্টভাবে 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 মিনিট হওয়া উচিত।
- লিখিত তথ্যের গ্রানুলারিটি : কতবার ডেটা নমুনা করা হয়েছিল।
- উদাহরণস্বরূপ, প্রতি ৫ সেকেন্ডে হৃদস্পন্দনের নমুনা লিখুন।
- প্রতিটি ডেটা টাইপের জন্য একই নমুনা হারের প্রয়োজন হয় না। প্রতি সেকেন্ডে ধাপ গণনার ডেটা আপডেট করার খুব একটা সুবিধা নেই, প্রতি 60 সেকেন্ডে কম ঘন ঘন ক্যাডেন্সের বিপরীতে।
- উচ্চতর নমুনা হার ব্যবহারকারীদের তাদের স্বাস্থ্য এবং ফিটনেস ডেটা সম্পর্কে আরও বিশদ এবং সুনির্দিষ্ট ধারণা দিতে পারে। নমুনা হারের ফ্রিকোয়েন্সিগুলি বিশদ এবং কর্মক্ষমতার মধ্যে ভারসাম্য বজায় রাখা উচিত।
অতিরিক্ত নির্দেশিকা
তথ্য লেখার সময় এই নির্দেশিকাগুলি অনুসরণ করুন:
- প্রতিটি সিঙ্কে, শুধুমাত্র নতুন ডেটা এবং সর্বশেষ সিঙ্কের পর থেকে পরিবর্তিত আপডেট করা ডেটা লিখুন।
- প্রতি লেখার অনুরোধে চাঙ্ক সর্বাধিক ১০০০টি রেকর্ডের অনুরোধ করে।
- ডিভাইসটি নিষ্ক্রিয় অবস্থায় থাকলে এবং ব্যাটারি কম না থাকলেই কেবল কাজগুলি চালানোর জন্য সীমাবদ্ধ করুন।
- ব্যাকগ্রাউন্ড কাজের জন্য, সর্বোচ্চ ১৫ মিনিট সময়সীমা সহ পর্যায়ক্রমিক কাজগুলি নির্ধারণ করতে 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 চালু রাখছে না তা যাচাই করুন।
হেলথ কানেক্টে ডেটা দুটি উপায়ের একটিতে লিখতে হবে:
- ইভেন্টটি সম্পন্ন হওয়ার পরে হেলথ কানেক্টের সাথে ডেটা সিঙ্ক করুন। উদাহরণস্বরূপ, ব্যবহারকারী যখন একটি ট্র্যাক করা ব্যায়াম সেশন শেষ করেন তখন ডেটা সিঙ্ক করুন।
- পরে ডেটা সিঙ্ক করার জন্য
WorkManager
ব্যবহার করে একটি একক কাজের সময়সূচী করুন।
লেখার গ্রানুলারিটি এবং ফ্রিকোয়েন্সির জন্য সেরা অনুশীলন
Health Connect-এ ডেটা লেখার সময়, উপযুক্ত রেজোলিউশন ব্যবহার করুন। উপযুক্ত রেজোলিউশন ব্যবহার স্টোরেজ লোড কমাতে সাহায্য করে, একই সাথে সামঞ্জস্যপূর্ণ এবং সঠিক ডেটা বজায় রাখে। ডেটা রেজোলিউশনে দুটি জিনিস অন্তর্ভুক্ত থাকে:
লেখার ফ্রিকোয়েন্সি : আপনার অ্যাপ্লিকেশন কত ঘন ঘন কোনও নতুন ডেটা হেলথ কানেক্টে পুশ করে। নতুন ডেটা উপলব্ধ থাকলে যত ঘন ঘন সম্ভব ডেটা লিখুন, ডিভাইসের কর্মক্ষমতার দিকে মনোযোগ দিন। ব্যাটারি লাইফ এবং অন্যান্য কর্মক্ষমতার দিকগুলিতে নেতিবাচক প্রভাব এড়াতে, লেখার মধ্যে সর্বাধিক ব্যবধান 15 মিনিট হওয়া উচিত।
লিখিত তথ্যের গ্রানুলারিটি : কত ঘন ঘন তথ্য পুশ করা হয়েছে তা নমুনা করা হয়েছে। উদাহরণস্বরূপ, প্রতি 5 সেকেন্ডে হৃদস্পন্দনের নমুনা লিখুন। প্রতিটি ডেটা টাইপের জন্য একই নমুনা হারের প্রয়োজন হয় না। প্রতি সেকেন্ডে ধাপ গণনার ডেটা আপডেট করার খুব একটা সুবিধা নেই, যেমন প্রতি 60 সেকেন্ডে কম ঘন ঘন ক্যাডেন্স। তবে, উচ্চতর নমুনা হার ব্যবহারকারীদের তাদের স্বাস্থ্য এবং ফিটনেস ডেটা সম্পর্কে আরও বিস্তারিত এবং সূক্ষ্ম দৃষ্টিভঙ্গি দিতে পারে। নমুনা হারের ফ্রিকোয়েন্সিগুলি বিশদ এবং কর্মক্ষমতার মধ্যে ভারসাম্য বজায় রাখা উচিত।
সিরিজ ডেটার জন্য স্ট্রাকচার রেকর্ড
যেসব ডেটা টাইপ একাধিক নমুনা ব্যবহার করে, যেমন HeartRateRecord
, তাদের জন্য আপনার রেকর্ডগুলি সঠিকভাবে গঠন করা গুরুত্বপূর্ণ। একটি একক, দিনব্যাপী রেকর্ড তৈরি করার পরিবর্তে যা ক্রমাগত আপডেট করা হয়, আপনার একাধিক ছোট রেকর্ড তৈরি করা উচিত, প্রতিটি একটি নির্দিষ্ট সময়ের ব্যবধানকে প্রতিনিধিত্ব করে।
উদাহরণস্বরূপ, হার্ট রেট ডেটার জন্য, আপনার প্রতি মিনিটের জন্য একটি নতুন HeartRateRecord
তৈরি করা উচিত। প্রতিটি রেকর্ডের সেই মিনিটের মধ্যে একটি শুরুর সময় এবং শেষের সময় থাকবে এবং সেই মিনিটে ধারণ করা সমস্ত হার্ট রেট নমুনা থাকবে।
হেলথ কানেক্টের সাথে নিয়মিত সিঙ্ক করার সময় (উদাহরণস্বরূপ, প্রতি ১৫ মিনিট অন্তর), আপনার অ্যাপটি পূর্ববর্তী সিঙ্কের পর থেকে তৈরি সমস্ত এক মিনিটের রেকর্ড লিখতে বাধ্য। এটি রেকর্ডগুলিকে একটি পরিচালনাযোগ্য আকারে রাখে এবং ডেটা অনুসন্ধান এবং প্রক্রিয়াকরণের কর্মক্ষমতা উন্নত করে।
নিম্নলিখিত উদাহরণে দেখানো হয়েছে কিভাবে এক মিনিটের জন্য একাধিক নমুনা সমন্বিত একটি 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.autoRecorded(
device = Device(type = Device.TYPE_WATCH)
))
সারা দিন পর্যবেক্ষণ করা ডেটা লিখুন
চলমান ভিত্তিতে সংগৃহীত ডেটার জন্য, যেমন ধাপগুলি, নতুন ডেটা পাওয়া গেলে আপনার আবেদনটি যত ঘন ঘন সম্ভব Health Connect-এ লেখা উচিত। ব্যাটারি লাইফ এবং অন্যান্য কর্মক্ষমতার দিকগুলিতে নেতিবাচক প্রভাব এড়াতে, লেখার মধ্যে সর্বাধিক ব্যবধান 15 মিনিট হওয়া উচিত।
ডেটা টাইপ | ইউনিট | প্রত্যাশিত | উদাহরণ |
ধাপ | ধাপ | প্রতি ১ মিনিটে | ২৩:১৪ - ২৩:১৫ - ৫টি ধাপ ২৩:১৬ - ২৩:১৭ - ২২ ধাপ ২৩:১৭ - ২৩:১৮ - ৮টি ধাপ |
স্টেপসক্যাডেন্স | ধাপ/মিনিট | প্রতি ১ মিনিটে | ২৩:১৪ - ২৩:১৫ - ৫ এসপিএম ২৩:১৬ - ২৩:১৭ - ২২ এসপিএম ২৩:১৭ - ২৩:১৮ - ৮ এসপিএম |
হুইলচেয়ার ঠেলে দেয় | ধাক্কা দেয় | প্রতি ১ মিনিটে | ২৩:১৪ - ২৩:১৫ - ৫টি ধাক্কা ২৩:১৬ - ২৩:১৭ - ২২টি ধাক্কা ২৩:১৭ - ২৩:১৮ - ৮টি ধাক্কা |
সক্রিয় ক্যালোরি পোড়া | ক্যালোরি | প্রতি ১৫ মিনিট অন্তর | ২৩:১৫ - ২৩:৩০ - ২ ক্যালোরি ২৩:৩০ - ২৩:৪৫ - ২৫ ক্যালোরি ২৩:৪৫ - ০০:০০ - ৫ ক্যালোরি |
মোট ক্যালোরি পোড়ানো হয়েছে | ক্যালোরি | প্রতি ১৫ মিনিট অন্তর | ২৩:১৫ - ২৩:৩০ - ১৬ ক্যালোরি ২৩:৩০ - ২৩:৪৫ - ১৬ ক্যালোরি ২৩:৪৫ - ০০:০০ - ১৬ ক্যালোরি |
দূরত্ব | কিমি/মিনিট | প্রতি ১ মিনিটে | ২৩:১৪-২৩:১৫ - ০.০০৮ কিমি ২৩:১৬ - ২৩:১৬ - ০.০২১ কিমি ২৩:১৭ - ২৩:১৮ - ০.০১২ কিমি |
উচ্চতা অর্জন | মি | প্রতি ১ মিনিটে | ২০:৩৬ - ২০:৩৭ - ৩.০৪৮ মি ২০:৩৯ - ২০:৪০ - ৩.০৪৮ মি ২৩:২৩ - ২৩:২৪ - ৯.১৪৪ মি |
মেঝে আরোহণ | মেঝে | প্রতি ১ মিনিটে | ২৩:১৪ - ২৩:১৫ - ৫ তলা ২৩:১৬ - ২৩:১৬ - ২২ তলা ২৩:১৭ - ২৩:১৮ - ৮ তলা |
হার্টরেট | বিপিএম | মিনিটে ৪ বার | সকাল ৬:১১:১৫ - ৫৫ বিপিএম সকাল ৬:১১:৩০ - ৫৬ বিপিএম সকাল ৬:১১:৪৫ - ৫৬ বিপিএম সকাল ৬:১২:০০ - ৫৫ বিপিএম |
হার্টরেটভ্যারিএবিলিটিআরএমএসএসডি | মি.সেকেন্ড | প্রতি ১ মিনিটে | সকাল ৬:১১ - ২৩ মি.সে. |
শ্বাসযন্ত্রের হার | শ্বাস/মিনিট | প্রতি ১ মিনিটে | ২৩:১৪ - ২৩:১৫ - ৬০ শ্বাস/মিনিট ২৩:১৬ - ২৩:১৬ - ৬২ শ্বাস/মিনিট ২৩:১৭ - ২৩:১৮ - ৬৪ শ্বাস/মিনিট |
অক্সিজেন স্যাচুরেশন | % | প্রতি ১ ঘন্টা অন্তর | ৬:১১ - ৯৫.২০৮% |
ওয়ার্কআউট বা ঘুমের সেশনের শেষে হেলথ কানেক্টে ডেটা লেখা উচিত। সক্রিয় ট্র্যাকিংয়ের জন্য, যেমন ব্যায়াম এবং ঘুম, অথবা পুষ্টির মতো ম্যানুয়াল ব্যবহারকারীর ইনপুট, এই রেকর্ডগুলি তৈরি করা হয় যখন অ্যাপটি সামনে থাকে, অথবা বিরল ঘটনাগুলিতে যেখানে এটি দিনে কয়েকবার ব্যবহার করা হয়।
আপনার অ্যাপটি ইভেন্টের পুরো সময়কাল ধরে Health Connect চালু রাখছে না তা যাচাই করুন।
হেলথ কানেক্টে ডেটা দুটি উপায়ের একটিতে লিখতে হবে:
- ইভেন্টটি সম্পন্ন হওয়ার পরে হেলথ কানেক্টের সাথে ডেটা সিঙ্ক করুন। উদাহরণস্বরূপ, ব্যবহারকারী যখন একটি ট্র্যাক করা ব্যায়াম সেশন শেষ করেন তখন ডেটা সিঙ্ক করুন।
- পরে ডেটা সিঙ্ক করার জন্য WorkManager ব্যবহার করে একটি একক কাজের সময়সূচী করুন।
ব্যায়াম এবং ঘুমের সেশন
কমপক্ষে, আপনার আবেদনপত্রে সারণি ২-এর " প্রত্যাশিত " কলামে দেওয়া নির্দেশিকা অনুসরণ করা উচিত। যেখানে সম্ভব, "সেরা" কলামে দেওয়া নির্দেশিকা অনুসরণ করুন।
নিম্নলিখিত টেবিলে দেখানো হয়েছে কিভাবে একটি অনুশীলনের সময় ডেটা লিখতে হয়:
ডেটা টাইপ | ইউনিট | প্রত্যাশিত | সেরা | উদাহরণ |
ধাপ | ধাপ | প্রতি ১ মিনিটে | প্রতি ১ সেকেন্ডে | ২৩:১৪-২৩:১৫ - ৫টি ধাপ ২৩:১৬ - ২৩:১৭ - ২২ ধাপ ২৩:১৭ - ২৩:১৮ - ৮টি ধাপ |
স্টেপসক্যাডেন্স | ধাপ/মিনিট | প্রতি ১ মিনিটে | প্রতি ১ সেকেন্ডে | ২৩:১৪-২৩:১৫ - ৩৫ এসপিএম ২৩:১৬ - ২৩:১৭ - ৩৭ এসপিএম ২৩:১৭ - ২৩:১৮ - ৪০ এসপিএম |
হুইলচেয়ার ঠেলে দেয় | ধাক্কা দেয় | প্রতি ১ মিনিটে | প্রতি ১ সেকেন্ডে | ২৩:১৪-২৩:১৫ - ৫টি ধাক্কা ২৩:১৬ - ২৩:১৭ - ২২টি ধাক্কা ২৩:১৭ - ২৩:১৮ - ৮টি ধাক্কা |
সাইক্লিংপেডেলিংক্যাডেন্স | আরপিএম | প্রতি ১ মিনিটে | প্রতি ১ সেকেন্ডে | ২৩:১৪-২৩:১৫ - ৬৫ আরপিএম ২৩:১৬ - ২৩:১৭ - ৭০ আরপিএম ২৩:১৭ - ২৩:১৮ - ৬৮ আরপিএম |
ক্ষমতা | ওয়াট | প্রতি ১ মিনিটে | প্রতি ১ সেকেন্ডে | ২৩:১৪-২৩:১৫ - ২৫০ ওয়াট ২৩:১৬ - ২৩:১৭ - ২৫৫ ওয়াট ২৩:১৭ - ২৩:১৮ - ২৪৫ ওয়াট |
গতি | কিমি/মিনিট | প্রতি ১ মিনিটে | প্রতি ১ সেকেন্ডে | ২৩:১৪-২৩:১৫ - ০.৩ কিমি/মিনিট ২৩:১৬ - ২৩:১৭ - ০.৪ কিমি/মিনিট ২৩:১৭ - ২৩:১৮ -০.৪ কিমি/মিনিট |
দূরত্ব | কিমি/মি | প্রতি ১ মিনিটে | প্রতি ১ সেকেন্ডে | ২৩:১৪-২৩:১৫ - ০.০০৮ কিমি ২৩:১৬ - ২৩:১৬ - ০.০২১ কিমি ২৩:১৭ - ২৩:১৮ - ০.০১২ কিমি |
সক্রিয় ক্যালোরি পোড়া | ক্যালোরি | প্রতি ১ মিনিটে | প্রতি ১ সেকেন্ডে | ২৩:১৪-২৩:১৫ - ২০ ক্যালোরি ২৩:১৬ - ২৩:১৭ - ২০ ক্যালোরি ২৩:১৭ - ২৩:১৮ - ২৫ ক্যালোরি |
মোট ক্যালোরি পোড়ানো হয়েছে | ক্যালোরি | প্রতি ১ মিনিটে | প্রতি ১ সেকেন্ডে | ২৩:১৪-২৩:১৫ - ৩৬ ক্যালোরি ২৩:১৬ - ২৩:১৭ - ৩৬ ক্যালোরি ২৩:১৭ - ২৩:১৮ - ৪১ ক্যালোরি |
উচ্চতা অর্জন | মি | প্রতি ১ মিনিটে | প্রতি ১ সেকেন্ডে | ২০:৩৬ - ২০:৩৭ - ৩.০৪৮ মি ২০:৩৯ - ২০:৪০ - ৩.০৪৮ মি ২৩:২৩ - ২৩:২৪ - ৯.১৪৪ মি |
ব্যায়ামের রুট | অক্ষাংশ/দীর্ঘ/অল্টারনেট | প্রতি ৩-৫ সেকেন্ডে | প্রতি ১ সেকেন্ডে | |
হার্টরেট | বিপিএম | মিনিটে ৪ বার | প্রতি ১ সেকেন্ডে | ২৩:১৪-২৩:১৫ - ১৫০ বিপিএম |
সারণি ৩-এ দেখানো হয়েছে কিভাবে ঘুমের সময় বা পরে ডেটা লিখতে হয়:
ডেটা টাইপ | ইউনিট | প্রত্যাশিত নমুনা | উদাহরণ |
স্লিপ স্টেজিং | মঞ্চ | ঘুমের প্রতিটি পর্যায়ের সময়কাল দানাদার | ২৩:৪৬ - ২৩:৫০ - জাগ্রত ২৩:৫০ - ২৩:৫৬ - হালকা ঘুম ২৩:৫৬ - ০০:১৬ - গভীর ঘুম |
রেস্টিংহার্টরেট | বিপিএম | একক দৈনিক মান (সকালে প্রথম জিনিসটি প্রত্যাশিত) | সকাল ৬:১১ - ৬০ বিপিএম |
অক্সিজেন স্যাচুরেশন | % | একক দৈনিক মান (সকালে প্রথম জিনিসটি প্রত্যাশিত) | ৬:১১ - ৯৫.২০৮% |
বহু-ক্রীড়া ইভেন্ট
এই পদ্ধতিটি বিদ্যমান ডেটা টাইপ এবং কাঠামো ব্যবহার করে এবং এটি বর্তমান হেলথ কানেক্ট বাস্তবায়ন এবং ডেটা রিডারগুলির সাথে সামঞ্জস্যতা যাচাই করে। এটি ফিটনেস প্ল্যাটফর্মগুলির দ্বারা গৃহীত একটি সাধারণ পদ্ধতি।
উপরন্তু, সাঁতার, বাইক চালানো এবং দৌড়ানোর মতো পৃথক সেশনগুলি হেলথ কানেক্টের মধ্যে সহজাতভাবে সংযুক্ত নয় এবং ডেটা রিডারদের অবশ্যই তাদের সময়ের নৈকট্যের উপর ভিত্তি করে এই সেশনগুলির মধ্যে সম্পর্ক অনুমান করতে হবে। সাঁতার থেকে বাইক চালানোর মতো সেগমেন্টগুলির মধ্যে পরিবর্তনগুলি স্পষ্টভাবে উপস্থাপন করা হয় না।
নিম্নলিখিত উদাহরণে ট্রায়াথলনের জন্য ডেটা কীভাবে লিখতে হয় তা দেখানো হয়েছে:
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))
ব্যতিক্রমগুলি পরিচালনা করুন
কোনও সমস্যার সম্মুখীন হলে Health Connect CRUD অপারেশনের জন্য স্ট্যান্ডার্ড ব্যতিক্রমগুলি প্রদান করে। আপনার অ্যাপের উচিত যথাযথভাবে এই ব্যতিক্রমগুলি ধরা এবং পরিচালনা করা।
HealthConnectClient
এর প্রতিটি পদ্ধতিতে এমন ব্যতিক্রমগুলি তালিকাভুক্ত করা হয়েছে যা থ্রো করা যেতে পারে। সাধারণভাবে, আপনার অ্যাপটি নিম্নলিখিত ব্যতিক্রমগুলি পরিচালনা করবে:
ব্যতিক্রম | বিবরণ | প্রস্তাবিত সেরা অনুশীলন |
---|---|---|
IllegalStateException | নিম্নলিখিত পরিস্থিতিগুলির মধ্যে একটি ঘটেছে:
| কোনও অনুরোধ করার আগে ইনপুটগুলির সাথে সম্ভাব্য সমস্যাগুলি প্রথমে সমাধান করুন। আপনার অনুরোধগুলিতে সরাসরি ব্যবহার করার পরিবর্তে, ভেরিয়েবলগুলিতে মান নির্ধারণ করুন অথবা একটি কাস্টম ফাংশনের মধ্যে প্যারামিটার হিসাবে ব্যবহার করুন যাতে আপনি ত্রুটি পরিচালনার কৌশলগুলি প্রয়োগ করতে পারেন। |
IOException | ডিস্ক থেকে তথ্য পড়ার এবং লেখার সময় কিছু সমস্যার সম্মুখীন হতে হচ্ছে। | এই সমস্যা এড়াতে, এখানে কিছু পরামর্শ দেওয়া হল:
|
RemoteException | SDK যে অন্তর্নিহিত পরিষেবার সাথে সংযুক্ত, তার মধ্যে বা যোগাযোগের সময় ত্রুটি ঘটেছে। উদাহরণস্বরূপ, আপনার অ্যাপটি একটি নির্দিষ্ট uid ব্যবহার করে একটি রেকর্ড মুছে ফেলার চেষ্টা করছে। তবে, অ্যাপটি অন্তর্নিহিত পরিষেবাটি পরীক্ষা করার পরে জানতে পারে যে রেকর্ডটি বিদ্যমান নেই, তখন ব্যতিক্রমটি বাতিল করা হয়। | এই সমস্যা এড়াতে, এখানে কিছু পরামর্শ দেওয়া হল:
|
SecurityException | অনুরোধগুলির জন্য অনুমতির প্রয়োজন হলে কিছু সমস্যার সম্মুখীন হতে হয় যা মঞ্জুর করা হয় না। | এটি এড়াতে, নিশ্চিত করুন যে আপনি আপনার প্রকাশিত অ্যাপের জন্য Health Connect ডেটা টাইপের ব্যবহার ঘোষণা করেছেন । এছাড়াও, আপনাকে ম্যানিফেস্ট ফাইল এবং আপনার কার্যকলাপে Health Connect অনুমতিগুলি ঘোষণা করতে হবে। |