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

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

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

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

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

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

স্বাস্থ্য সংযোগের উপলব্ধতা পরীক্ষা করুন

Health Connect ব্যবহার করার চেষ্টা করার আগে, আপনার অ্যাপটিকে যাচাই করা উচিত যে ব্যবহারকারীর ডিভাইসে Health Connect উপলব্ধ রয়েছে। Health Connect সব ডিভাইসে আগে থেকে ইনস্টল নাও থাকতে পারে বা অক্ষম করা যেতে পারে। আপনি 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() দ্বারা প্রত্যাবর্তিত স্থিতির উপর নির্ভর করে, আপনি প্রয়োজনে Google Play Store থেকে 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 ম্যানিফেস্টে ঘোষণা করা হয়েছে।

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(SleepSessionRecord::class),
  HealthPermission.getWritePermission(SleepSessionRecord::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)
  }
}

যেহেতু ব্যবহারকারীরা যেকোন সময় অনুমতি মঞ্জুর বা প্রত্যাহার করতে পারে, আপনার অ্যাপটিকে পর্যায়ক্রমে মঞ্জুর করা অনুমতিগুলি পরীক্ষা করতে হবে এবং অনুমতি হারিয়ে গেলে পরিস্থিতিগুলি পরিচালনা করতে হবে।

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

নিম্নলিখিত সমষ্টিগত মান 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"
            ),
        )
    )
}
  • সেশনগুলি সাধারণ পরিমাপের জন্য ব্যবহার করা উচিত নয় , যেমন দৈনিক ধাপের সংখ্যা।
  • সাবটাইপ ডেটাতে একটি UID থাকে না, তবে সংশ্লিষ্ট ডেটাতে স্বতন্ত্র UID থাকে।
  • সাবটাইপ ডেটাকে একটি সেশনে সারিবদ্ধ করা প্রয়োজন যাতে ওভারল্যাপ হয় না এমন ক্রমিক টাইমস্ট্যাম্প। ফাঁক অনুমোদিত, তবে.
  • যদি ব্যবহারকারী একটি সেশনের সাথে ডেটা যুক্ত করতে চান (এবং এর অংশ হিসাবে ট্র্যাক করতে চান) তবে সেশনগুলি উপযোগী হয়, ক্রমাগত রেকর্ড না করে।

ঘুমের সেশন

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

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

একটি ঘুম অধিবেশন পড়ুন

ফিরে আসা প্রতিটি ঘুমের সেশনের জন্য, আপনার ঘুমের পর্যায়ের ডেটাও উপস্থিত আছে কিনা তা পরীক্ষা করা উচিত:

suspend fun readSleepSessions(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    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
    }
}

একটি ঘুম অধিবেশন মুছুন

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

suspend fun deleteSleepSession(
    healthConnectClient: HealthConnectClient,
    sleepRecord: SleepSessionRecord,
) {
    val timeRangeFilter = TimeRangeFilter.between(sleepRecord.startTime, sleepRecord.endTime)
    healthConnectClient.deleteRecords(SleepSessionRecord::class, timeRangeFilter)
}