नींद के सेशन ट्रैक करना

यह गाइड, Health Connect के वर्शन 1.1.0-alpha11 के साथ काम करती है.

Health Connect, नींद के सेशन का डेटा टाइप उपलब्ध कराता है. इससे उपयोगकर्ता की नींद के बारे में जानकारी सेव की जा सकती है. जैसे, रात में सोने या दिन में झपकी लेने के सेशन के बारे में. SleepSessionRecord डेटा टाइप का इस्तेमाल, इन सेशन को दिखाने के लिए किया जाता है.

सेशन की मदद से, उपयोगकर्ता किसी समयावधि के दौरान, समय के हिसाब से परफ़ॉर्मेंस मेज़र कर सकते हैं. जैसे, लगातार धड़कन की दर या जगह का डेटा.

SleepSessionRecord सेशन में ऐसा डेटा होता है जो नींद के चरणों को रिकॉर्ड करता है. जैसे, AWAKE, SLEEPING, और DEEP.

सबटाइप डेटा, ऐसा डेटा होता है जो किसी सेशन से "जुड़ा" होता है. यह सिर्फ़ तब काम का होता है, जब इसे पैरंट सेशन के साथ पढ़ा जाता है. उदाहरण के लिए, नींद का चरण.

इसके उलट, एसोसिएटेड डेटा का मतलब ऐसे डेटा से है जो अलग से रिकॉर्ड किया जाता है, लेकिन यह किसी सेशन की समयावधि के अंदर आता है. उदाहरण के लिए, अगर कोई उपयोगकर्ता अपने नींद के सेशन के दौरान, धड़कन की दर रिकॉर्ड करता है, तो धड़कन की दर का डेटा, एसोसिएटेड डेटा होगा. सबटाइप डेटा, सेशन रिकॉर्ड का हिस्सा होता है. वहीं, एसोसिएटेड डेटा में अलग-अलग रिकॉर्ड होते हैं. हर रिकॉर्ड का अपना यूयूआईडी होता है.

यह देखना कि Health Connect मौजूद और चालू है या नहीं

Health Connect का इस्तेमाल करने से पहले, आपके ऐप्लिकेशन को यह पुष्टि करनी चाहिए कि उपयोगकर्ता के डिवाइस पर Health Connect इंस्टॉल हो. ऐसा हो सकता है कि Health Connect, सभी डिवाइसों पर पहले से इंस्टॉल न हो या इसे बंद कर दिया गया हो. HealthConnectClient.getSdkStatus() का इस्तेमाल करके, यह देखा जा सकता है कि Health Connect उपलब्ध है या नहीं.

यह देखना कि Health Connect मौजूद और चालू है या नहीं

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 का इस्तेमाल करें. इससे, 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 के लिए, ये एग्रीगेट वैल्यू उपलब्ध हैं:

सामान्य दिशा-निर्देश

यहां Health Connect में नींद के सेशन के साथ काम करने के सबसे सही तरीके दिए गए हैं.

  • नींद के लिए, किसी खास नींद के सेशन से डेटा जोड़ने के लिए, सेशन का इस्तेमाल किया जाना चाहिए:

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"
            ),
        )
    )
}

  • सबटाइप डेटा को किसी सेशन में, क्रम से लगाए गए ऐसे टाइमस्टैंप के साथ अलाइन किया जाना चाहिए जो एक-दूसरे से ओवरलैप न होते हों. हालांकि, इनमें गैप हो सकते हैं.
  • सबटाइप डेटा में यूयूआईडी नहीं होता है, लेकिन एसोसिएटेड डेटा में अलग-अलग यूयूआईडी होते हैं.
  • सेशन तब काम के होते हैं, जब उपयोगकर्ता चाहता है कि डेटा को किसी सेशन से जोड़ा जाए (और उसे सेशन के हिस्से के तौर पर ट्रैक किया जाए). इसके बजाय, डेटा को लगातार रिकॉर्ड न किया जाए.

नींद के सेशन

Health Connect में, नींद का डेटा पढ़ा या सेव किया जा सकता है. नींद का डेटा, सेशन के तौर पर दिखता है. इसे नींद के आठ अलग-अलग चरणों में बांटा जा सकता है:

  • UNKNOWN: यह नहीं बताया गया है या यह पता नहीं है कि उपयोगकर्ता सो रहा है या नहीं.
  • AWAKE: उपयोगकर्ता नींद के दौरान जाग रहा है, न कि दिन में.
  • SLEEPING: नींद के बारे में सामान्य या नॉन-ग्रैनुलर जानकारी.
  • OUT_OF_BED: उपयोगकर्ता नींद के सेशन के बीच में बिस्तर से उठ जाता है.
  • AWAKE_IN_BED: उपयोगकर्ता बिस्तर पर लेटे होने के बावजूद नींद नहीं आई.
  • LIGHT: उपयोगकर्ता हल्की नींद में है.
  • DEEP: उपयोगकर्ता गहरी नींद में है.
  • 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)