Health Connect-এর মাধ্যমে ঘুমের অভিজ্ঞতা ডেভেলপ করা

আপনি যদি নিজের অ্যাপে ঘুম ট্র্যাক করার অভিজ্ঞতা তৈরি করতে চান, তাহলে আপনি এইসব কাজ করতে Health Connect ব্যবহার করতে পারেন:

  • ঘুমের সেশন সংক্রান্ত ডেটা লেখা
  • ঘুমের স্টেজ সংক্রান্ত ডেটা লেখা
  • হার্ট রেট, অক্সিজেন স্যাচুরেশন ও শ্বাস-প্রশ্বাসের হারের মতো ঘুমের ডেটা লেখা
  • অন্যান্য অ্যাপ থেকে ঘুমের ডেটা পড়া

এইসব স্লিপ ফিচার কীভাবে তৈরি করতে হয় তা এই নির্দেশিকায় বর্ণনা করা হয়েছে। এর মধ্যে রয়েছে ডেটার ধরন, ব্যাকগ্রাউন্ডে এক্সিকিউট করা, অনুমতি, সাজেস্ট করা ওয়ার্কফ্লো এবং পেশাদার পদ্ধতি।

এক ঝলকে: একটি বিস্তারিত স্লিপ ট্র্যাকার তৈরি করা

আপনি এইসব মূল ধাপ অনুসরণ করে Health Connect ব্যবহার করে একটি বিস্তারিত ঘুম ট্র্যাক করার অভিজ্ঞতা তৈরি করতে পারবেন:

  • Health সংক্রান্ত অনুমতির উপর ভিত্তি করে সঠিকভাবে অনুমতি প্রয়োগ করা।
  • SleepSessionRecord ব্যবহার করে সেশন রেকর্ড করা।
  • সেশন চলাকালীন ঘুমের বিভিন্ন পর্যায়, হার্ট রেট ও অক্সিজেনের স্যাচুরেশনের মতো ডেটা প্রকারগুলি ধারাবাহিকভাবে লেখা।
  • ওভারনাইট একটানা ডেটা ক্যাপচার যাচাই করতে ব্যাকগ্রাউন্ড এক্সিকিউশন সঠিকভাবে ম্যানেজ করা।
  • ঘুমের পরে সারসংক্ষেপ ও বিশ্লেষণের জন্য সেশন ডেটা পড়া।

এই ওয়ার্কফ্লো অন্যান্য Health Connect অ্যাপের সাথে ইন্টারঅপারেবিলিটি চালু করে এবং ব্যবহারকারী-নিয়ন্ত্রিত ডেটা অ্যাক্সেস যাচাই করে।

শুরু করার আগে

স্লিপ ফিচার প্রয়োগ করার আগে:

মূল ধারণা

Health Connect কয়েকটি মূল কম্পোনেন্ট ব্যবহার করে ঘুমের ডেটা দেখায়। A SleepSessionRecord ঘুমের কেন্দ্রীয় রেকর্ড হিসেবে কাজ করে, এতে শুরু ও শেষ হওয়ার সময় এবং ঘুমের বিভিন্ন পর্যায়ের মতো বিবরণ থাকে। সেশন চলাকালীন, HeartRateRecord বা OxygenSaturationRecord-এর মতো বিভিন্ন ধরনের ডেটা রেকর্ড করা যেতে পারে।

ঘুমের সেশন

ঘুমের ডেটা SleepSessionRecord দিয়ে দেখানো হয়। প্রতিটি রেকর্ড স্টোর:

  • startTime
  • endTime
  • stages: গভীর, হালকা, REM, ও জেগে থাকা ঘুমের মতো SleepSessionRecord.Stage-এর তালিকা।
  • ঐচ্ছিক সেশন মেটাডেটা (নাম, নোট)

অ্যাপ সেশনের সাথে যুক্ত একাধিক ধরনের ডেটা লিখতে পারে।

ডেটার প্রকার

ঘুমের সেশন চলাকালীন রেকর্ড করা সাধারণ ডেটার মধ্যে এগুলি অন্তর্ভুক্ত:

  • SleepSessionRecord: গভীর, হালকা, REM ও জেগে থাকা সহ ঘুমের সময়সীমা ও পর্যায় রেকর্ড করে।
  • HeartRateRecord: ঘুমের সময় হার্ট রেট রেকর্ড করে।
  • OxygenSaturationRecord: ঘুমের সময় অক্সিজেন স্যাচুরেশন (SpO2) রেকর্ড করে।
  • RespiratoryRateRecord: ঘুমের সময় শ্বাস-প্রশ্বাসের হার রেকর্ড করে।

প্রতিটি ডেটার ধরন আলাদা আলাদা রেকর্ড হিসেবে সেভ করা হয়।

ডেভেলপমেন্ট সংক্রান্ত বিবেচ্য বিষয়

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

ব্যাকগ্রাউন্ড এক্সিকিউশন

স্লিপ ট্র্যাকিং অ্যাপ সাধারণত স্ক্রিন বন্ধ করে সারারাত চলে। এই অবস্থায়, আপনাকে এগুলি ব্যবহার করতে হবে:

  • ডেটা সংগ্রহের জন্য ফোরগ্রাউন্ড পরিষেবা
  • WorkManager ডেটা লেখা বা সিঙ্ক করার জন্য
  • হার্ট রেটের মতো গ্র্যানুলার ডেটার নিয়মিত রেকর্ড লেখার জন্য ব্যাচিং স্ট্র্যাটেজি

সবকটি রাইট জুড়ে সেশন আইডি একই রেখে ধারাবাহিকতা বজায় রাখুন।

অনুমতি

স্লিপ ডেটা রিড বা রাইট করার আগে আপনার অ্যাপকে অবশ্যই প্রাসঙ্গিক Health Connect অনুমতি অনুরোধ করতে হবে। ডেটার ধরনের সম্পূর্ণ তালিকা দেখতে, Health Connect ডেটার ধরন দেখুন। ঘুমের জন্য সাধারণ অনুমতির মধ্যে হার্ট রেট বা অক্সিজেনের স্যাচুরেশনের মতো ঘুম সেশন ও মেট্রিক অন্তর্ভুক্ত।

নিচে উল্লেখ করা অনুমতি দিয়ে ঘুমের অ্যাক্সেস সুরক্ষিত করা হয়:

  • android.permission.health.READ_SLEEP
  • android.permission.health.WRITE_SLEEP

আপনার অ্যাপে ঘুম সংক্রান্ত সুবিধা যোগ করতে, SleepSession ডেটা টাইপের জন্য অনুমতি চেয়ে শুরু করুন।

স্লিপ লেখার জন্য আপনাকে এই অনুমতি ঘোষণা করতে হবে:

<application>
  <uses-permission
android:name="android.permission.health.WRITE_SLEEP" />
...
</application>

ঘুমের ডেটা পড়তে, আপনাকে নিম্নলিখিত অনুমতিগুলির জন্য অনুরোধ করতে হবে:

<application>
  <uses-permission
android:name="android.permission.health.READ_SLEEP" />
...
</application>

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

ক্লায়েন্ট ইনস্ট্যান্স তৈরি করার পরে, আপনার অ্যাপকে ব্যবহারকারীর কাছে অনুমতি চেয়ে অনুরোধ করতে হবে। ব্যবহারকারীদের যেকোনও সময় অনুমতি দেওয়া বা প্রত্যাহার করার সুবিধা দিতে হবে। এটি করতে, প্রয়োজনীয় ডেটার ধরনের জন্য অনুমতির একটি সেট তৈরি করুন। সেটে থাকা অনুমতিগুলি প্রথমে আপনার Android মেনিফেস্টে ঘোষণা করা হয়েছে কিনা তা ভালো করে দেখে নিন।

val permissions =
    setOf(
        HealthPermission.getReadPermission(SleepSessionRecord::class),
        HealthPermission.getWritePermission(SleepSessionRecord::class),
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class),
        HealthPermission.getReadPermission(OxygenSaturationRecord::class),
        HealthPermission.getWritePermission(OxygenSaturationRecord::class),
        HealthPermission.getReadPermission(RespiratoryRateRecord::class),
        HealthPermission.getWritePermission(RespiratoryRateRecord::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.") }
    }
}
যেহেতু ব্যবহারকারীরা যেকোনও সময় অনুমতি দিতে বা প্রত্যাহার করতে পারেন, তাই আপনার অ্যাপকে প্রতিবার অনুমতি ব্যবহার করার আগে তা চেক করতে হবে এবং অনুমতি প্রত্যাহার করা হলে সেই পরিস্থিতি সামলাতে হবে।

স্লিপ সেশন প্রয়োগ করা

এই বিভাগে ঘুম সংক্রান্ত ডেটা রেকর্ড করার জন্য সাজেস্ট করা ওয়ার্কফ্লো বর্ণনা করা হয়েছে।

HeartRateRecord বা OxygenSaturationRecord-এর মতো ডেটা স্লিপ সেশনের সাথে অ্যালাইন করতে, সেশনের startTime ও endTime-এর মধ্যে থাকা টাইমস্ট্যাম্প দিয়ে সেগুলি রেকর্ড করুন। গ্র্যানুলার ডেটার সাথে ঘুমের সেশন লিঙ্ক করার জন্য Health Connect সেশন শনাক্তকারী ব্যবহার করে না। পরিবর্তে, ওভারল্যাপ করা সময়ের ব্যবধানের মাধ্যমে অ্যাসোসিয়েশন ইমপ্লিসিট হয়। ঘুমের ডেটা পড়ার সময়, আপনি কোনও সেশনের টাইম রেঞ্জ ব্যবহার করে সংশ্লিষ্ট ডেটা কোয়েরি করতে পারবেন, যেমনটি ঘুমের ডেটা পড়া নিবন্ধে দেখানো হয়েছে।

সেশন লেখা

ঘুমের সেশন জুড়ে হার্ট রেটের মতো গ্র্যানুলার ডেটা রেকর্ড করা গেলেও, SleepSessionRecord-কে Health Connect-এ শুধুমাত্র সেশন শেষ হওয়ার পরে একবারই লিখতে হবে, যেমন ব্যবহারকারী ঘুম থেকে উঠলে। রেকর্ডে সেশন startTime, endTime এবং সেশন চলাকালীন রেকর্ড করা SleepSessionRecord.Stage অবজেক্টের তালিকা অবশ্যই থাকতে হবে, কারণ SleepSessionRecord-এর ক্ষেত্রে endTime অবশ্যই startTime-এর পরে থাকতে হবে।

স্লিপ সেশন লিখতে:

  1. অনন্য ক্লায়েন্ট রেকর্ড আইডি তৈরি করুন।
  2. ব্যবহারকারী জেগে উঠলে বা স্লিপ ট্র্যাকিং বন্ধ হয়ে গেলে, ঘুমের সব পর্যায় সংগ্রহ করে SleepSessionRecordতৈরি করুন।
  3. insertRecords ব্যবহার করে রেকর্ড যোগ করুন।

উদাহরণ:

val clientRecordId = UUID.randomUUID().toString()
val sessionStartTime = LocalDateTime.of(2023, 10, 30, 22, 0).toInstant(ZoneOffset.UTC)
val sessionEndTime = LocalDateTime.of(2023, 10, 31, 7, 0).toInstant(ZoneOffset.UTC)

val stages = mutableListOf<SleepSessionRecord.Stage>()
// Add recorded stages, for example:
stages.add(SleepSessionRecord.Stage(
    startTime = sessionStartTime.plusSeconds(3600),
    endTime = sessionStartTime.plusSeconds(7200),
    stage = SleepSessionRecord.STAGE_TYPE_LIGHT)
)
stages.add(SleepSessionRecord.Stage(
    startTime = sessionStartTime.plusSeconds(7200),
    endTime = sessionStartTime.plusSeconds(10800),
    stage = SleepSessionRecord.STAGE_TYPE_DEEP)
)
// ... other stages

val session = SleepSessionRecord(
    startTime = sessionStartTime,
    startZoneOffset = ZoneOffset.UTC,
    endTime = sessionEndTime,
    endZoneOffset = ZoneOffset.UTC,
    stages = stages,
    metadata = Metadata(clientRecordId = clientRecordId)
)

healthConnectClient.insertRecords(listOf(session))

ঘুমের ডেটা পড়া

অ্যাক্টিভিটির সারসংক্ষেপ করতে, স্বাস্থ্য সংক্রান্ত ইনসাইট প্রদান করতে বা এক্সটার্নাল সার্ভারের সাথে ডেটা সিঙ্ক করতে, অ্যাপগুলি ঘুমের সেশন ও তার সাথে সম্পর্কিত ডেটা পড়তে পারে। যেমন, আপনি SleepSessionRecord পড়তে পারেন এবং তারপরে একই সময়সীমার মধ্যে হওয়া HeartRateRecord সম্পর্কে কোয়েরি করতে পারেন।

সম্পর্কিত ডেটা সহ সেশন পড়ুন

আপনি ReadRecordsRequest-এর সাহায্যে SleepSessionRecord রেকর্ড টাইপ হিসেবে ব্যবহার করে, একটি টাইম রেঞ্জ অনুযায়ী ফিল্টার করে স্লিপ সেশন পড়তে পারবেন। নির্দিষ্ট সেশনের জন্য সম্পর্কিত ডেটা পড়তে, বেছে নেওয়া ডেটার ধরনের জন্য দ্বিতীয় অনুরোধ করুন, যেমন HeartRateRecord—স্লিপ সেশনের startTime ও endTime অনুযায়ী ফিল্টার করা।

নিচের উদাহরণে দেখানো হয়েছে কীভাবে নির্দিষ্ট সময়সীমার মধ্যে ঘুমের সেশন ও তার সাথে যুক্ত হার্ট রেট ডেটা পড়তে হয়:

suspend fun readSleepSessionsWithAssociatedData(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    val response = healthConnectClient.readRecords(
        ReadRecordsRequest(
            recordType = SleepSessionRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )

    for (sleepRecord in response.records) {
        // Process each session
        val stages = sleepRecord.stages
        val notes = sleepRecord.notes

        // To read specific granular data (like heart rate) that occurred during
        // this session, use the session's startTime and endTime to filter
        // the request for that data type.
        val hrResponse = healthConnectClient.readRecords(
            ReadRecordsRequest(
                recordType = HeartRateRecord::class,
                timeRangeFilter = TimeRangeFilter.between(
                    sleepRecord.startTime,
                    sleepRecord.endTime
                )
            )
        )
        for (heartRateRecord in hrResponse.records) {
            for (sample in heartRateRecord.samples) {
                val bpm = sample.beatsPerMinute
            }
        }
    }
}

পেশাদার পদ্ধতি

ডেটার নির্ভরযোগ্যতা ও ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে এইসব নির্দেশিকা অনুসরণ করুন:

  • অ্যাক্টিভ ট্র্যাকিং চলাকালীন ঘন ঘন লিখুন: অ্যাক্টিভ ট্র্যাকিংয়ের জন্য, ডেটা উপলভ্য হওয়ার সাথে সাথে অথবা সর্বাধিক ১৫ মিনিট অন্তর ডেটা লিখুন।
  • ব্যাকগ্রাউন্ড সিঙ্কের জন্য WorkManager ব্যবহার করুন: ডিফার্ড রাইটের জন্য WorkManager ব্যবহার করুন। রিয়েল-টাইম ডেটা এবং ব্যাটারি দক্ষতার মধ্যে ভারসাম্য বজায় রাখতে ১৫-মিনিটের ব্যবধানে ডেটা সংগ্রহ করার চেষ্টা করুন।
  • ব্যাচ রাইট রিকোয়েস্ট: প্রতিটি সেন্সর ইভেন্ট আলাদা আলাদা করে লিখবেন না। আপনার অনুরোধকে ছোট ছোট ভাগে ভাগ করুন। প্রতিটি লেখার অনুরোধে Health Connect সর্বাধিক ১০০০টি রেকর্ড ম্যানেজ করে।
  • সেশন আইডি স্থিতিশীল ও অনন্য রাখুন: আপনার সেশনের জন্য সামঞ্জস্যপূর্ণ শনাক্তকারী ব্যবহার করুন। কোনও সেশন এডিট বা আপডেট করা হলে, একই আইডি ব্যবহার করলে সেটি নতুন, আলাদা সেশন হিসেবে গণ্য করা হয় না।
  • ডেটার ধরনের জন্য ব্যাচিং ব্যবহার করুন: ইনপুট/আউটপুট ওভারহেড কমাতে এবং ব্যাটারির আয়ু বজায় রাখতে, প্রতিটি ডেটা পয়েন্ট আলাদা আলাদা করে লেখার পরিবর্তে আপনার ডেটা পয়েন্টগুলিকে একটি insertRecords কলের মধ্যে গ্রুপ করুন।
  • ডুপ্লিকেট ডেটা লেখা এড়িয়ে চলুন: ক্লায়েন্ট আইডি ব্যবহার করুন: রেকর্ড তৈরি করার সময়, metadata.clientRecordId সেট করুন। অনন্য রেকর্ড শনাক্ত করতে Health Connect এটি ব্যবহার করে। আপনি যদি আগে থেকেই আছে এমন clientRecordId সহ কোনও রেকর্ড লেখার চেষ্টা করেন, তাহলে Health Connect ডুপ্লিকেটটি উপেক্ষা করবে বা নতুন রেকর্ড তৈরি করার পরিবর্তে বিদ্যমান রেকর্ডটি আপডেট করবে। সিঙ্ক করার প্রচেষ্টা আবার করার সময় বা অ্যাপ আবার ইনস্টল করার সময় ডুপ্লিকেট এড়ানোর সবচেয়ে কার্যকর উপায় হল metadata.clientRecordId সেট করা।
    val record = StepsRecord(
        count = 100,
        startTime = startTime,
        endTime = endTime,
        startZoneOffset = ZoneOffset.UTC,
        endZoneOffset = ZoneOffset.UTC,
        metadata = Metadata(
            // Use a unique ID from your own database
            clientRecordId = "daily_steps_2023_10_27_user_123"
        )
    )
  • আগে থেকে থাকা ডেটা চেক করুন: সিঙ্ক করার আগে, আপনার অ্যাপের রেকর্ড আগে থেকেই আছে কিনা তা দেখতে, সময়সীমা কোয়েরি করুন।
  • টাইমস্ট্যাম্প যেন ওভারল্যাপ না করে তা নিশ্চিত করুন: নতুন সেশন যেন আগের সেশন শেষ হওয়ার আগে শুরু না হয় তা ভালো করে দেখে নিন। ওভারল্যাপ করা সেশন ফিটনেস ড্যাশবোর্ড ও সারসংক্ষেপ গণনার ক্ষেত্রে সমস্যা সৃষ্টি করতে পারে।
  • অনুমতির জন্য স্পষ্ট যুক্তি দিন: আপনার অ্যাপের কেন স্বাস্থ্য ডেটা অ্যাক্সেস করা প্রয়োজন তা ব্যাখ্যা করতে Permission.createIntent ফ্লো ব্যবহার করুন, যেমন: 'আপনার রক্তচাপের ট্রেন্ড মনিটর করতে এবং ইনসাইট প্রদান করতে।'
  • দীর্ঘক্ষণ ধরে চলা সেশন পরীক্ষা করুন: আপনার ব্যাচিং ইন্টারভ্যাল ও সেন্সর ব্যবহার ডিভাইসকে ড্রেন করে দেয় কিনা তা যাচাই করতে, কয়েক ঘণ্টা ধরে চলা সেশনের সময় ব্যাটারি কতটা খরচ হচ্ছে তা মনিটর করুন।
  • সেন্সর রেটের সাথে টাইমস্ট্যাম্প অ্যালাইন করা: ডেটা হাই-ফিডেলিটি বজায় রাখতে, আপনার রেকর্ড করা টাইমস্ট্যাম্পের সাথে সেন্সরের আসল ফ্রিকোয়েন্সি ম্যাচ করুন।

পরীক্ষা করা

ডেটা সঠিক আছে কিনা এবং ব্যবহারকারীর অভিজ্ঞতা খুব ভালো কিনা তা যাচাই করতে, এইসব পরীক্ষা করার কৌশল অনুসরণ করুন এবং অফিসিয়াল সবচেয়ে গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে পরীক্ষা ডকুমেন্টেশন দেখুন।

যাচাইকরণ টুল

  • Health Connect টুলবক্স: রেকর্ড ম্যানুয়ালি চেক করতে, টেস্ট ডেটা মুছে দিতে এবং ডেটাবেসে পরিবর্তন সিমুলেট করতে এই কম্প্যানিয়ন অ্যাপ ব্যবহার করুন। আপনার রেকর্ড সঠিকভাবে সেভ করা হচ্ছে কিনা তা যাচাই করার এটিই সবচেয়ে ভাল উপায়।
  • FakeHealthConnectClient-এর মাধ্যমে ইউনিট টেস্টিং: আপনার অ্যাপ কীভাবে অনুমতি প্রত্যাহার বা API ব্যতিক্রমের মতো এজ কেসগুলি হ্যান্ডেল করে তা যাচাই করতে টেস্টিং লাইব্রেরি ব্যবহার করুন। এর জন্য কোনও ফিজিক্যাল ডিভাইসের প্রয়োজন নেই।

কোয়ালিটি চেকলিস্ট

সাধারণ স্থাপত্য

স্লিপ ট্র্যাকিংয়ের প্রয়োগের মধ্যে সাধারণত এগুলি অন্তর্ভুক্ত থাকে:

কম্পোনেন্ট ম্যানেজ করে
সেশন কন্ট্রোলার সেশন স্টেট
টাইমার
ব্যাচিং লজিক
ডেটার ধরন কন্ট্রোলার
ডেটা সংগ্রহ
রেপোজিটরি লেয়ার (Health Connect অপারেশন র‍্যাপ করে:) সেশন যোগ করা
ডেটার ধরন যোগ করা
ঘুমের বিভিন্ন পর্যায় যোগ করা
সেশনের সারসংক্ষেপ পড়া
UI লেয়ার (ডিসপ্লে): সময়সীমা
লাইভ ডেটার ধরন
ঘুমের বিভিন্ন পর্যায় সংক্রান্ত ভিজ্যুয়ালাইজেশন

সমস্যার সমাধান

সমস্যার উপসর্গ সম্ভাব্য কারণ রেজোলিউশন
ডেটার ধরন উল্লেখ করা নেই (যেমন, হার্ট রেট) লেখার অনুমতি না থাকা বা ভুল টাইম ফিল্টার। আপনি অনুরোধ করেছেন এবং ব্যবহারকারী নির্দিষ্ট ডেটার ধরন সংক্রান্ত অনুমতি দিয়েছেন কিনা তা চেক করুন। যাচাই করে দেখুন যে আপনার ReadRecordsRequest সেশনের সাথে ম্যাচ করে এমন TimeRangeFilter ব্যবহার করে। অনুমতি দেখুন।
সেশন লেখা যায়নি ওভারল্যাপ করা টাইমস্ট্যাম্প। Health Connect একই অ্যাপের বিদ্যমান ডেটার সাথে ওভারল্যাপ করা রেকর্ড বাতিল করতে পারে। নতুন সেশনের startTime যেন আগের সেশনের endTime-এর পরে হয় তা নিশ্চিত করুন।
ঘুমের সময় কোনও সেন্সর ডেটা রেকর্ড করা হয়নি ফোরগ্রাউন্ড সার্ভিস বন্ধ করে দেওয়া হয়েছে বা সেটি অ্যাক্টিভ নেই। স্ক্রিন বন্ধ থাকা অবস্থায় রাতারাতি সেন্সর ডেটা সংগ্রহ করতে, আপনি foregroundServiceType="health" সহ ফোরগ্রাউন্ড পরিষেবা ব্যবহার করতে পারেন।
ডুপ্লিকেট রেকর্ড দেখা যায় clientRecordId নেই। প্রতিটি রেকর্ডের Metadata-এ একটি অনন্য clientRecordId অ্যাসাইন করুন। সিঙ্ক করার প্রসেস আবার শুরু করার সময় একই ডেটা দু'বার লেখা হলে, এটি Health Connect-কে ডুপ্লিকেট ডেটা সরিয়ে দিতে সাহায্য করে। পেশাদার পদ্ধতি দেখুন।

ডিবাগ করার সাধারণ ধাপ

অনুমতির স্ট্যাটাস চেক করুন। রিড বা রাইট অপারেশন করার আগে সবসময় getPermissionStatus()-কে কল করুন। ব্যবহারকারী যেকোনও সময় সিস্টেম সেটিংস থেকে অনুমতি প্রত্যাহার করতে পারবেন।
এক্সিকিউশন মোড যাচাই করুন। আপনার অ্যাপ ব্যাকগ্রাউন্ডে ডেটা সংগ্রহ না করলে, আপনার AndroidManifest.xml ফাইলে সঠিক অনুমতি ঘোষণা করেছেন কিনা এবং ব্যবহারকারী অ্যাপটিকে "ব্যাটারি সীমাবদ্ধ" মোডে রাখেননি কিনা তা যাচাই করুন।