হেলথ কানেক্টের সাথে ঘুমের অভিজ্ঞতা বিকাশ করুন

আপনি যদি আপনার অ্যাপে একটি ঘুম ট্র্যাক করার অভিজ্ঞতা তৈরি করতে চান, তাহলে হেলথ কানেক্ট ব্যবহার করে নিম্নলিখিত কাজগুলো করতে পারেন:

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

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

সারসংক্ষেপ: একটি পূর্ণাঙ্গ স্লিপ ট্র্যাকার তৈরি করা

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

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

এই কর্মপ্রবাহটি অন্যান্য হেলথ কানেক্ট অ্যাপের সাথে আন্তঃকার্যক্ষমতা সক্ষম করে এবং ব্যবহারকারী-নিয়ন্ত্রিত ডেটা অ্যাক্সেস যাচাই করে।

শুরু করার আগে

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

মূল ধারণা

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

ঘুমের সেশন

ঘুমের তথ্য SleepSessionRecord দ্বারা উপস্থাপিত হয়। প্রতিটি রেকর্ডে সংরক্ষিত থাকে:

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

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

ডেটা টাইপ

ঘুমের সময় রেকর্ড করা সাধারণ ডেটার প্রকারগুলির মধ্যে রয়েছে:

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

প্রতিটি ডেটা টাইপ একটি স্বতন্ত্র রেকর্ড হিসেবে সংরক্ষিত হয়।

উন্নয়ন বিবেচনা

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

পটভূমি সম্পাদন

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

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

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

অনুমতি

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

ঘুমানোর সুযোগ নিম্নলিখিত অনুমতিগুলো দ্বারা সুরক্ষিত:

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

আপনার অ্যাপে স্লিপ মোড যুক্ত করার জন্য, প্রথমে SleepSession ডেটা টাইপের জন্য অনুমতি চেয়ে নিন।

`sleep` লেখার জন্য আপনাকে যে অনুমতিটি ঘোষণা করতে হবে তা এখানে দেওয়া হলো:

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

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

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

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

একটি ক্লায়েন্ট ইনস্ট্যান্স তৈরি করার পর, আপনার অ্যাপকে ব্যবহারকারীর কাছ থেকে অনুমতির জন্য অনুরোধ করতে হবে। ব্যবহারকারীদের যেকোনো সময় অনুমতি প্রদান বা প্রত্যাখ্যান করার ক্ষমতা থাকতে হবে।

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

// Create a set of permissions for required data types
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 ব্যবহার করুন। এটি হেলথ কানেক্ট পারমিশন স্ক্রিনটি প্রদর্শন করবে।

// 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)
  }
}

যেহেতু ব্যবহারকারীরা যেকোনো সময় অনুমতি দিতে বা প্রত্যাহার করতে পারেন, তাই আপনার অ্যাপকে প্রতিবার ব্যবহারের আগে অনুমতি যাচাই করতে হবে এবং অনুমতি হারিয়ে গেলে তার মোকাবিলা করতে হবে।

একটি ঘুমের সেশন বাস্তবায়ন করুন

এই অংশে ঘুমের তথ্য লিপিবদ্ধ করার জন্য প্রস্তাবিত কার্যপ্রবাহ বর্ণনা করা হয়েছে।

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

একটি সেশন লিখুন

যদিও ঘুমের পুরো সময় জুড়ে হৃদস্পন্দনের মতো সূক্ষ্ম তথ্য রেকর্ড করা যায়, SleepSessionRecord ফাইলটি শুধুমাত্র সেশন শেষ হওয়ার পরেই হেলথ কানেক্ট-এ লিখতে হবে, যেমন ব্যবহারকারী যখন ঘুম থেকে জেগে ওঠেন। রেকর্ডটিতে অবশ্যই সেশনের 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 কোয়েরি করতে পারেন।

সংশ্লিষ্ট ডেটা সহ সেশন পড়ুন

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

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি নির্দিষ্ট সময়সীমার জন্য সংশ্লিষ্ট হৃদস্পন্দনের ডেটাসহ ঘুমের সেশনগুলি পড়তে হয়:

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 ব্যবহার করুন। রিয়েল-টাইম ডেটা এবং ব্যাটারির কার্যকারিতার মধ্যে ভারসাম্য বজায় রাখতে ১৫ মিনিটের ব্যবধান রাখার লক্ষ্য রাখুন।
  • ব্যাচ রাইট রিকোয়েস্ট : প্রতিটি সেন্সর ইভেন্ট আলাদাভাবে লিখবেন না। আপনার রিকোয়েস্টগুলোকে কয়েকটি ভাগে ভাগ করুন। হেলথ কানেক্ট প্রতি রাইট রিকোয়েস্টে ১০০০টি পর্যন্ত রেকর্ড পরিচালনা করতে পারে।
  • সেশন আইডি স্থিতিশীল এবং অনন্য রাখুন : আপনার সেশনগুলির জন্য সামঞ্জস্যপূর্ণ শনাক্তকারী ব্যবহার করুন। যদি কোনো সেশন সম্পাদনা বা আপডেট করা হয়, তবে একই আইডি ব্যবহার করলে সেটিকে একটি নতুন, পৃথক সেশন হিসাবে গণ্য করা হয় না।
  • ডেটা টাইপের জন্য ব্যাচিং ব্যবহার করুন : ইনপুট/আউটপুট ওভারহেড কমাতে এবং ব্যাটারির আয়ু বাঁচাতে, প্রতিটি ডেটা পয়েন্ট আলাদাভাবে লেখার পরিবর্তে সেগুলোকে একটিমাত্র insertRecords কলে একত্রিত করুন।
  • ডুপ্লিকেট ডেটা লেখা এড়িয়ে চলুন: ক্লায়েন্ট আইডি ব্যবহার করুন : রেকর্ড তৈরি করার সময়, একটি metadata.clientRecordId সেট করুন। হেলথ কানেক্ট অনন্য রেকর্ড শনাক্ত করতে এটি ব্যবহার করে। আপনি যদি এমন একটি clientRecordId দিয়ে রেকর্ড লেখার চেষ্টা করেন যা ইতিমধ্যেই বিদ্যমান, তাহলে হেলথ কানেক্ট ডুপ্লিকেটটি উপেক্ষা করবে অথবা নতুন রেকর্ড তৈরি না করে বিদ্যমান রেকর্ডটি আপডেট করবে। সিঙ্ক পুনরায় চেষ্টা করার সময় বা অ্যাপ পুনরায় ইনস্টল করার সময় ডুপ্লিকেট প্রতিরোধ করার সবচেয়ে কার্যকর উপায় হলো 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 ফ্লো ব্যবহার করুন, উদাহরণস্বরূপ: 'আপনার রক্তচাপের প্রবণতা পর্যবেক্ষণ করতে এবং অন্তর্দৃষ্টি প্রদান করতে।'
  • দীর্ঘ সময় ধরে চলা সেশন পরীক্ষা করুন : কয়েক ঘন্টা ধরে চলা সেশন চলাকালীন ব্যাটারির ব্যবহার পর্যবেক্ষণ করে যাচাই করুন যে আপনার ব্যাচিং ইন্টারভাল এবং সেন্সরের ব্যবহার ডিভাইসটির চার্জ দ্রুত শেষ করে দিচ্ছে না।
  • সেন্সর রেটের সাথে টাইমস্ট্যাম্প মেলান : ডেটার উচ্চ নির্ভুলতা বজায় রাখতে আপনার রেকর্ডের টাইমস্ট্যাম্পগুলোকে সেন্সরের প্রকৃত ফ্রিকোয়েন্সির সাথে মেলান।

পরীক্ষা

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

যাচাইকরণ সরঞ্জাম

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

গুণমান চেকলিস্ট

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

একটি ঘুম ট্র্যাক করার বাস্তবায়নে সাধারণত অন্তর্ভুক্ত থাকে:

উপাদান পরিচালনা করে
সেশন নিয়ন্ত্রক সেশন অবস্থা
টাইমার
ব্যাচিং লজিক
ডেটা টাইপ কন্ট্রোলার
তথ্য সংগ্রহ
রিপোজিটরি লেয়ার (হেলথ কানেক্ট অপারেশনগুলোকে আবৃত করে:) সেশন ঢোকান
ডেটা টাইপ সন্নিবেশ করুন
ঘুমের পর্যায়গুলি সন্নিবেশ করে
সেশনের সারাংশ পড়ুন
UI স্তর (প্রদর্শন): সময়কাল
লাইভ ডেটা প্রকার
ঘুমের পর্যায় দৃশ্যায়ন

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

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

সাধারণ ডিবাগিং পদক্ষেপ

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