ঘুমের সেশন ট্র্যাক করুন

এই নির্দেশিকাটি হেলথ কানেক্ট সংস্করণ 1.1.0-alpha11 এর সাথে সামঞ্জস্যপূর্ণ।

হেলথ কানেক্ট ব্যবহারকারীর ঘুম সম্পর্কিত তথ্য, যেমন রাতের সেশন বা দিনের বেলার ঘুম, সংরক্ষণ করার জন্য একটি স্লিপ সেশন ডেটা টাইপ প্রদান করে। এই সেশনগুলোকে উপস্থাপন করার জন্য SleepSessionRecord ডেটা টাইপটি ব্যবহৃত হয়।

সেশন ব্যবহারকারীদের একটি নির্দিষ্ট সময় ধরে সময়-ভিত্তিক কর্মক্ষমতা পরিমাপ করার সুযোগ দেয়, যেমন অবিচ্ছিন্ন হৃদস্পন্দন বা অবস্থানের ডেটা।

SleepSessionRecord সেশনগুলিতে এমন ডেটা থাকে যা ঘুমের বিভিন্ন পর্যায়, যেমন— AWAKE , SLEEPING ) এবং DEEP রেকর্ড করে।

সাবটাইপ ডেটা হলো এমন ডেটা যা একটি সেশনের "অধীন" এবং শুধুমাত্র প্যারেন্ট সেশনের মাধ্যমে পড়লেই তা অর্থপূর্ণ হয়। উদাহরণস্বরূপ, ঘুমের পর্যায়।

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

হেলথ কানেক্ট-এর প্রাপ্যতা যাচাই করুন

হেলথ কানেক্ট ব্যবহার করার চেষ্টা করার আগে, আপনার অ্যাপের যাচাই করে নেওয়া উচিত যে ব্যবহারকারীর ডিভাইসে হেলথ কানেক্ট উপলব্ধ আছে কিনা। সব ডিভাইসে হেলথ কানেক্ট আগে থেকে ইনস্টল করা নাও থাকতে পারে বা এটি নিষ্ক্রিয় করা থাকতে পারে। আপনি HealthConnectClient.getSdkStatus() মেথড ব্যবহার করে এর উপলব্ধতা পরীক্ষা করতে পারেন।

হেলথ কানেক্ট-এর প্রাপ্যতা কীভাবে পরীক্ষা করবেন

fun checkHealthConnectAvailability(context: Context) {
    val providerPackageName = "com.google.android.apps.healthdata" // Or get from HealthConnectClient.DEFAULT_PROVIDER_PACKAGE_NAME
    val availabilityStatus = HealthConnectClient.getSdkStatus(context, providerPackageName)

    if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE) {
      // Health Connect is not available. Guide the user to install/enable it.
      // For example, show a dialog.
      return // early return as there is no viable integration
    }
    if (availabilityStatus == HealthConnectClient.SDK_UNAVAILABLE_PROVIDER_UPDATE_REQUIRED) {
      // Health Connect is available but requires an update.
      // Optionally redirect to package installer to find a provider, for example:
      val uriString = "market://details?id=$providerPackageName&url=healthconnect%3A%2F%2Fonboarding"
      context.startActivity(
        Intent(Intent.ACTION_VIEW).apply {
          setPackage("com.android.vending")
          data = Uri.parse(uriString)
          putExtra("overlay", true)
          putExtra("callerId", context.packageName)
        }
      )
      return
    }
    // Health Connect is available, obtain a HealthConnectClient instance
    val healthConnectClient = HealthConnectClient.getOrCreate(context)
    // Issue operations with healthConnectClient
}

getSdkStatus() থেকে প্রাপ্ত স্ট্যাটাসের উপর নির্ভর করে, প্রয়োজনে আপনি ব্যবহারকারীকে গুগল প্লে স্টোর থেকে হেলথ কানেক্ট ইনস্টল বা আপডেট করার জন্য নির্দেশনা দিতে পারেন।

বৈশিষ্ট্যের প্রাপ্যতা

এই ডেটা টাইপের জন্য কোনো ফিচার অ্যাভেইলেবিলিটি ফ্ল্যাগ নেই।

প্রয়োজনীয় অনুমতি

স্লিপ সেশনে প্রবেশাধিকার নিম্নলিখিত অনুমতি দ্বারা সুরক্ষিত:

  • 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>

ব্যবহারকারীর কাছ থেকে অনুমতি অনুরোধ করুন

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

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

সমর্থিত সমষ্টি

SleepSessionRecord জন্য নিম্নলিখিত সমষ্টিগত মানগুলি উপলব্ধ:

সাধারণ নির্দেশিকা

হেলথ কানেক্ট-এ স্লিপ সেশন কীভাবে ব্যবহার করবেন, সে বিষয়ে এখানে কিছু সেরা অনুশীলন নির্দেশিকা দেওয়া হলো।

  • একটি নির্দিষ্ট স্লিপ সেশন থেকে ডেটা যোগ করার জন্য সেশন ব্যবহার করা উচিত, ঘুমের জন্য:

suspend fun writeSleepSession(healthConnectClient: HealthConnectClient) {
    healthConnectClient.insertRecords(
        listOf(
            SleepSessionRecord(
                startTime = Instant.parse("2022-05-10T23:00:00.000Z"),
                startZoneOffset = ZoneOffset.of("-08:00"),
                endTime = Instant.parse("2022-05-11T07:00:00.000Z"),
                endZoneOffset = ZoneOffset.of("-08:00"),
                title = "My Sleep"
            ),
        )
    )
}

  • একটি সেশনে সাবটাইপ ডেটাকে অবশ্যই ক্রমানুসারে সাজানো টাইমস্ট্যাম্পের সাথে সারিবদ্ধ করতে হবে, যাতে একটির সাথে অন্যটির ওভারল্যাপ না হয়। তবে, এর মধ্যে ফাঁক থাকতে পারে।
  • সাবটাইপ ডেটাতে কোনো UUID থাকে না, কিন্তু সংশ্লিষ্ট ডেটার স্বতন্ত্র UUID থাকে।
  • সেশন তখন কার্যকর হয়, যখন ব্যবহারকারী চান যে ডেটা অবিচ্ছিন্নভাবে রেকর্ড না হয়ে একটি সেশনের সাথে যুক্ত থাকুক (এবং তার অংশ হিসেবে ট্র্যাক করা হোক)।

ঘুমের সেশন

আপনি হেলথ কানেক্ট-এ ঘুমের ডেটা পড়তে বা লিখতে পারেন। ঘুমের ডেটা একটি সেশন হিসেবে প্রদর্শিত হয় এবং এটিকে ৮টি স্বতন্ত্র ঘুমের পর্যায়ে ভাগ করা যায়:

  • UNKNOWN : ব্যবহারকারী ঘুমিয়ে থাকলে এটি অনির্দিষ্ট বা অজানা।
  • AWAKE : ব্যবহারকারী ঘুমের চক্রের মধ্যে জাগ্রত আছেন, দিনের বেলায় নয়।
  • SLEEPING : ঘুমের সাধারণ বা অনির্দিষ্ট বর্ণনা।
  • OUT_OF_BED : ব্যবহারকারী ঘুমের মাঝখানে বিছানা থেকে উঠে পড়ে।
  • AWAKE_IN_BED : ব্যবহারকারী বিছানায় জেগে আছেন।
  • LIGHT : ব্যবহারকারী হালকা ঘুমের চক্রে আছেন।
  • DEEP : ব্যবহারকারী গভীর ঘুমে আছেন।
  • REM : ব্যবহারকারী REM ঘুমচক্রে আছেন।

এই মানগুলো একটি নির্দিষ্ট সময়সীমার মধ্যে ব্যবহারকারীর ঘুমের ধরণকে নির্দেশ করে। ঘুমের পর্যায়গুলো লেখা ঐচ্ছিক, তবে উপলব্ধ থাকলে তা করার পরামর্শ দেওয়া হয়।

ঘুমের সেশন লিখুন

SleepSessionRecord ডেটা টাইপের দুটি অংশ রয়েছে:

  1. সামগ্রিক অধিবেশন, যা ঘুমের সম্পূর্ণ সময়কাল জুড়ে বিস্তৃত।
  2. ঘুমের বিভিন্ন পর্যায়, যেমন হালকা ঘুম বা গভীর ঘুম।

ধাপ ছাড়া স্লিপ সেশন যুক্ত করার পদ্ধতি নিচে দেওয়া হলো:

SleepSessionRecord(
    title = "weekend sleep",
    startTime = startTime,
    endTime = endTime,
    startZoneOffset = ZoneOffset.UTC,
    endZoneOffset = ZoneOffset.UTC,
)

একটি ঘুমের সম্পূর্ণ সময়কাল জুড়ে পর্যায়গুলি যোগ করার পদ্ধতি এখানে দেওয়া হলো:

val stages = listOf(
    SleepSessionRecord.Stage(
        startTime = START_TIME,
        endTime = END_TIME,
        stage = SleepSessionRecord.STAGE_TYPE_SLEEPING,
    )
)

SleepSessionRecord(
        title = "weekend sleep",
        startTime = START_TIME,
        endTime = END_TIME,
        startZoneOffset = START_ZONE_OFFSET,
        endZoneOffset = END_ZONE_OFFSET,
        stages = stages,
)

ঘুমের একটি সেশন পড়ুন

প্রাপ্ত প্রতিটি স্লিপ সেশনের জন্য, আপনার যাচাই করে দেখা উচিত যে স্লিপ স্টেজ ডেটাও উপস্থিত আছে কিনা:

val response =
    healthConnectClient.readRecords(
        ReadRecordsRequest(
            SleepSessionRecord::class,
            timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
        )
    )
for (sleepRecord in response.records) {
    // Retrieve relevant sleep stages from each sleep record
    val sleepStages = sleepRecord.stages
}

একটি স্লিপ সেশন মুছে ফেলুন

এইভাবে একটি সেশন ডিলিট করতে হয়। এই উদাহরণের জন্য, আমরা একটি স্লিপ সেশন ব্যবহার করেছি:

val timeRangeFilter = TimeRangeFilter.between(sleepRecord.startTime, sleepRecord.endTime)
healthConnectClient.deleteRecords(SleepSessionRecord::class, timeRangeFilter)