ডেটা এডিট করা

এই গাইড Health Connect ভার্সন ১.১.০-alpha১২ বা তার পরবর্তী ভার্সনের সাথে মানানসই।

এই গাইডে 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 ভ্যালুতে তুলনামূলক চেক করে। যোগ করা ডেটার ভার্সন যদি আগে থেকে থাকা ডেটার ভার্সনের চেয়ে বেশি হয়, তাহলে আপসার্ট হয়। অন্যথায়, প্রসেসটি পরিবর্তনটি উপেক্ষা করে এবং ভ্যালু একই থাকে।

আপনার ডেটাতে ভার্সন সংক্রান্ত তথ্য যোগ করতে, আপনাকে ভার্সন সংক্রান্ত লজিকের উপর ভিত্তি করে Long ভ্যালু সহ Metadata.clientRecordVersion প্রদান করতে হবে।

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-এ ডেটা লেখার সময়, উপযুক্ত রেজোলিউশন ব্যবহার করুন। সঠিক রেজোলিউশন ব্যবহার করলে স্টোরেজের লোড কমে, অথচ ডেটা সামঞ্জস্যপূর্ণ ও সঠিক থাকে। ডেটা রেজোলিউশনে ২টি জিনিস অন্তর্ভুক্ত থাকে:

  1. কত ঘন ঘন ডেটা লেখা হয়: আপনার অ্যাপ্লিকেশন কত ঘন ঘন Health Connect-এ নতুন ডেটা পুশ করে। নতুন ডেটা উপলভ্য হলে, ডিভাইসের পারফর্ম্যান্সের কথা মাথায় রেখে, যত ঘন ঘন সম্ভব ডেটা লিখুন। ব্যাটারির আয়ু এবং অন্যান্য পারফর্ম্যান্সের উপর নেতিবাচক প্রভাব এড়াতে, দুটি রাইটের মধ্যে সর্বাধিক ব্যবধান ১৫ মিনিট হওয়া উচিত।

  2. লিখিত ডেটার গ্রানুলারিটি: পুশ করা ডেটা কত ঘন ঘন স্যাম্পেল করা হয়েছে। যেমন, প্রতি ৫ সেকেন্ডে হার্ট রেটের স্যাম্পেল লিখুন। সব ধরনের ডেটার জন্য একই স্যাম্পেল রেটের প্রয়োজন হয় না। প্রতি সেকেন্ডে স্টেপ কাউন্ট ডেটা আপডেট করার সুবিধা খুব কম, এর পরিবর্তে প্রতি ৬০ সেকেন্ডের মতো কম ফ্রিকোয়েন্সিতে আপডেট করা ভালো। তবে, স্যাম্পেল রেট বেশি হলে ব্যবহারকারীরা তাদের স্বাস্থ্য ও ফিটনেস ডেটা আরও বিস্তারিত এবং পুঙ্খানুপুঙ্খভাবে দেখতে পারেন। স্যাম্পেল রেট ফ্রিকোয়েন্সি ডিটেল ও পারফর্ম্যান্সের মধ্যে ভারসাম্য বজায় রাখতে হবে।

সিরিজ ডেটার জন্য স্ট্রাকচার রেকর্ড

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

ক্যালরি

প্রতি ১৫ মিনিটে

২৩:১৫ - ২৩:৩০ - ১৬ ক্যালোরি

২৩:৩০ - ২৩:৪৫ - ১৬ ক্যালোরি

২৩:৪৫ - ০০:০০ - ১৬ ক্যালোরি

দূরত্ব

কিমি/মিনিট

প্রতি ১ মিনিটে

২৩:১৪-২৩:১৫ - ০.০০৮ কিমি

২৩:১৬ - ২৩:১৬ - ০.০২১ কিমি

২৩:১৭ - ২৩:১৮ - ০.০১২ কিমি

ElevationGained

মি

প্রতি ১ মিনিটে

২০:৩৬ - ২০:৩৭ - ৩.০৪৮ মি

২০:৩৯ - ২০:৪০ - ৩.০৪৮ মি

২৩:২৩ - ২৩:২৪ - ৯.১৪৪ মি

FloorsClimbed

ফ্লোর

প্রতি ১ মিনিটে

২৩:১৪ - ২৩:১৫ - ৫টি ফ্লোর

২৩:১৬ - ২৩:১৬ - ২২টি ফ্লোর

২৩:১৭ - ২৩:১৮ - ৮টি ফ্লোর

HeartRate

BPM

মিনিটে ৪ বার

৬:১১:১৫am - ৫৫ bpm

সকাল ৬:১১:৩০ - ৫৬ bpm

সকাল ৬:১১:৪৫ - ৫৬ bpm

সকাল ৬:১২:০০ - ৫৫ বিট পার মিনিট (BPM)

HeartRateVariabilityRmssd

ms

প্রতি ১ মিনিটে

৬:১১am - ২৩ মিলি.সে.

RespiratoryRate

শ্বাস/মিনিট

প্রতি ১ মিনিটে

২৩:১৪ - ২৩:১৫ - ৬০ বার শ্বাস-প্রশ্বাস/মিনিট

২৩:১৬ - ২৩:১৬ - ৬২ বার শ্বাস-প্রশ্বাস/মিনিট

২৩:১৭ - ২৩:১৮ - ৬৪ বার শ্বাস-প্রশ্বাস/মিনিট

OxygenSaturation

%

প্রতি ১ ঘণ্টায়

6:11 - 95.208%

ওয়ার্কআউট বা ঘুমের সেশন শেষ হওয়ার পরে Health Connect-এ ডেটা লিখতে হবে। ব্যায়াম এবং ঘুমের মতো অ্যাক্টিভ ট্র্যাকিং বা পুষ্টির মতো ম্যানুয়াল ব্যবহারকারীর ইনপুটের জন্য, অ্যাপটি ফোরগ্রাউন্ডে থাকাকালীন বা বিরল ইভেন্টে যেখানে এটি দিনে কয়েকবার ব্যবহার করা হয়, সেখানে এই রেকর্ডগুলি তৈরি করা হয়।

যাচাই করুন যে আপনার অ্যাপ ইভেন্টের পুরো সময় জুড়ে Health Connect চালু রাখছে না।

Health Connect-এ ডেটা অবশ্যই দুটি উপায়ের মধ্যে একটি উপায়ে লিখতে হবে:

  • ইভেন্ট সম্পূর্ণ হওয়ার পরে Health Connect-এর সাথে ডেটা সিঙ্ক করুন। যেমন, ব্যবহারকারী ট্র্যাক করা এক্সারসাইজ সেশন শেষ করলে ডেটা সিঙ্ক করা।
  • পরে ডেটা সিঙ্ক করার জন্য WorkManager ব্যবহার করে একটি ওয়ান-অফ টাস্ক শিডিউল করুন।

ব্যায়াম ও ঘুমের সেশন

কমপক্ষে, আপনার অ্যাপ্লিকেশনকে সারণী ২-এর প্রত্যাশিত কলামের নির্দেশিকা অনুসরণ করতে হবে। সম্ভব হলে, সেরা কলামে দেওয়া নির্দেশিকা অনুসরণ করুন।

অনুশীলন চলাকালীন কীভাবে ডেটা লিখতে হয় তা নিম্নলিখিত সারণীতে দেখানো হয়েছে:

সারণী ২: এক্সারসাইজ সেশন চলাকালীন ডেটা লেখার জন্য নির্দেশিকা

ডেটার ধরন

ইউনিট

প্রত্যাশিত

ভালো থাকবেন

উদাহরণ

ধাপ

ধাপ

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ৫টি ধাপ

২৩:১৬ - ২৩:১৭ - ২২টি ধাপ

২৩:১৭ - ২৩:১৮ - ৮টি ধাপ

StepsCadence

পা ফেলা/মিনিট

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ৩৫ spm

২৩:১৬ - ২৩:১৭ - ৩৭ spm

২৩:১৭ - ২৩:১৮ - ৪০ spm

হুইলচেয়ার পুশ করা সংক্রান্ত ডেটা

পুশ করা

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ৫ বার পুশ করা হয়েছে

২৩:১৬ - ২৩:১৭ - ২২ বার পুশ করা হয়েছে

২৩:১৭ - ২৩:১৮ - ৮টি পুশ

CyclingPedalingCadence

rpm

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ৬৫ rpm

২৩:১৬ - ২৩:১৭ - ৭০ rpm

২৩:১৭ - ২৩:১৮ - ৬৮ rpm

বিদ্যুৎ

ওয়াট

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ২৫০ ওয়াট

২৩:১৬ - ২৩:১৭ - ২৫৫ ওয়াট

২৩:১৭ - ২৩:১৮ - ২৪৫ ওয়াট

গতি

কিমি/মিনিট

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ০.৩ কিমি/মিনিট

২৩:১৬ - ২৩:১৭ - ০.৪ কিমি/মিনিট

২৩:১৭ - ২৩:১৮ -০.৪ কিমি/মিনিট

দূরত্ব

কিমি/মিঃ

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ০.০০৮ কিমি

২৩:১৬ - ২৩:১৬ - ০.০২১ কিমি

২৩:১৭ - ২৩:১৮ - ০.০১২ কিমি

ActiveCaloriesBurned

ক্যালরি

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ২০ ক্যালোরি

২৩:১৬ - ২৩:১৭ - ২০ ক্যালোরি

২৩:১৭ - ২৩:১৮ - ২৫ ক্যালোরি

TotalCaloriesBurned

ক্যালরি

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ৩৬ ক্যালোরি

২৩:১৬ - ২৩:১৭ - ৩৬ ক্যালোরি

২৩:১৭ - ২৩:১৮ - ৪১ ক্যালোরি

ElevationGained

মি

প্রতি ১ মিনিটে

প্রতি ১ সেকেন্ডে

২০:৩৬ - ২০:৩৭ - ৩.০৪৮ মি

২০:৩৯ - ২০:৪০ - ৩.০৪৮ মি

২৩:২৩ - ২৩:২৪ - ৯.১৪৪ মি

ExerciseRoutes

অক্ষাংশ/দ্রাঘিমাংশ/উচ্চতা

প্রতি ৩-৫ সেকেন্ড অন্তর

প্রতি ১ সেকেন্ডে

HeartRate

BPM

মিনিটে ৪ বার

প্রতি ১ সেকেন্ডে

২৩:১৪-২৩:১৫ - ১৫০ BPM

স্লিপ সেশন চলাকালীন বা পরে কীভাবে ডেটা লিখতে হয় তা সারণী ৩-এ দেখানো হয়েছে:

সারণী ৩: স্লিপ সেশন চলাকালীন বা পরে ডেটা লেখার জন্য নির্দেশিকা

ডেটার ধরন

ইউনিট

প্রত্যাশিত স্যাম্পেল

উদাহরণ

ঘুমের বিভিন্ন স্টেজ

স্টেজ

ঘুমের প্রতিটি পর্যায়ের জন্য সময়ের গ্র্যানুলার পিরিয়ড

২৩:৪৬ - ২৩:৫০ - জেগে আছে

২৩:৫০ - ২৩:৫৬ - হালকা ঘুম

২৩:৫৬ - ০০:১৬ - গভীর ঘুম

RestingHeartRate

BPM

প্রতিদিনের একটি ভ্যালু (সকালে প্রথম জিনিস হিসেবে প্রত্যাশিত)

সকাল ৬:১১ - ৬০ BPM

OxygenSaturation

%

দৈনিক একটি ভ্যালু (সকালে প্রথম জিনিস হিসেবে প্রত্যাশিত)

6:11 - 95.208%

মাল্টি-স্পোর্ট ইভেন্ট

এই পদ্ধতি আগে থেকে থাকা ডেটার ধরন ও স্ট্রাকচার ব্যবহার করে এবং বর্তমান 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))

ব্যতিক্রম ম্যানেজ করুন

কোনও সমস্যা দেখা দিলে, CRUD অপারেশনের জন্য Health Connect স্ট্যান্ডার্ড ব্যতিক্রম দেখায়। আপনার অ্যাপকে এইসব ব্যতিক্রমের প্রতিটি যথাযথভাবে ক্যাচ ও ম্যানেজ করতে হবে।

HealthConnectClient-এর প্রতিটি পদ্ধতি সেইসব ব্যতিক্রমের তালিকা তৈরি করে যেগুলি থ্রো করা যেতে পারে। সাধারণত, আপনার অ্যাপকে নিম্নলিখিত ব্যতিক্রমগুলি ম্যানেজ করতে হবে:

টেবিল ১: Health Connect ব্যতিক্রম এবং সাজেস্ট করা পেশাদার পদ্ধতি
ব্যতিক্রম বিবরণ সাজেস্ট করা পেশাদার পদ্ধতি
IllegalStateException নিম্নলিখিত পরিস্থিতিগুলির মধ্যে কোনও একটি ঘটেছে:

  • Health Connect পরিষেবা উপলভ্য নেই।
  • অনুরোধটি সঠিক কনস্ট্রাকশন নয়। যেমন, নির্দিষ্ট সময় অন্তর বাকেটে অ্যাগ্রিগেট অনুরোধ যেখানে timeRangeFilter-এর জন্য Instant অবজেক্ট ব্যবহার করা হয়।

অনুরোধ করার আগে ইনপুটের সাথে সম্ভাব্য সমস্যাগুলি প্রথমে সমাধান করুন। সম্ভব হলে, ভেরিয়েবলে ভ্যালু অ্যাসাইন করুন অথবা আপনার অনুরোধে সরাসরি ব্যবহার করার পরিবর্তে কাস্টম ফাংশনের মধ্যে প্যারামিটার হিসেবে ব্যবহার করুন যাতে আপনি সমস্যা সমাধানের স্ট্র্যাটেজি প্রয়োগ করতে পারেন।
IOException ডিস্ক থেকে ডেটা পড়া ও লেখার সময় সমস্যা হয়েছে। এই সমস্যা এড়াতে, এখানে কিছু সাজেশন দেওয়া হল:

  • ব্যবহারকারীর যেকোনও ইনপুটের ব্যাক-আপ নিন।
  • বাল্ক রাইট অপারেশন চলাকালীন কোনও সমস্যা হলে তা সমাধান করতে পারবেন। যেমন, প্রসেসটি যাতে সমস্যাটি এড়িয়ে গিয়ে বাকি অপারেশনগুলি সম্পন্ন করতে পারে তা নিশ্চিত করুন।
  • অনুরোধ সংক্রান্ত সমস্যা ম্যানেজ করতে আবার চেষ্টা করা ও ব্যাকঅফ স্ট্র্যাটেজি প্রয়োগ করুন।

RemoteException SDK যে পরিষেবার সাথে কানেক্ট করে, সেই পরিষেবার মধ্যে বা তার সাথে যোগাযোগ করার সময় কোনও সমস্যা হয়েছে।

যেমন, আপনার অ্যাপ প্রদত্ত uid-এর মাধ্যমে কোনও রেকর্ড মুছে ফেলার চেষ্টা করছে। তবে, অন্তর্নিহিত পরিষেবা চেক করার পরে অ্যাপটি যখন জানতে পারে যে রেকর্ডটি নেই, তখন ব্যতিক্রম দেখানো হয়।
এই সমস্যা এড়াতে, এখানে কিছু সাজেশন দেওয়া হল:

  • আপনার অ্যাপের ডেটাস্টোর এবং Health Connect-এর মধ্যে নিয়মিত সিঙ্ক করুন।
  • অনুরোধ সংক্রান্ত সমস্যা ম্যানেজ করতে আবার চেষ্টা করা ও ব্যাকঅফ স্ট্র্যাটেজি প্রয়োগ করুন।

SecurityException অনুরোধের জন্য প্রয়োজনীয় অনুমতি না দেওয়া হলে সমস্যা দেখা দেয়। এটি এড়াতে, আপনার প্রকাশিত অ্যাপের জন্য Health Connect ডেটার ধরন ব্যবহারের ঘোষণা করেছেন কিনা তা ভালভাবে দেখে নিন। এছাড়াও, আপনাকে Health Connect-এর অনুমতি ম্যানিফেস্ট ফাইলে এবং আপনার অ্যাক্টিভিটিতে ঘোষণা করতে হবে।