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

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

হেলথ কানেক্ট একটি স্লিপ সেশন ডেটা টাইপ প্রদান করে, যা ব্যবহারকারীর ঘুম সম্পর্কে তথ্য সংরক্ষণ করে, যেমন রাতের সেশন বা দিনের ঘুম। এই সেশনগুলি উপস্থাপন করতে 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() দ্বারা ফেরত দেওয়া স্ট্যাটাসের উপর নির্ভর করে, আপনি প্রয়োজনে ব্যবহারকারীকে গুগল প্লে স্টোর থেকে 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>

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

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

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

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(SleepSessionRecord::class),
  HealthPermission.getWritePermission(SleepSessionRecord::class)
)

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

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