এই নির্দেশিকা Health Connect-এর 1.1.0-alpha11 ভার্সনের সাথে মানানসই।
Health Connect ঘুমের সেশন ডেটা টাইপ প্রদান করে, যা
ব্যবহারকারীর ঘুম সম্পর্কিত তথ্য স্টোর করে, যেমন রাতের সেশন বা দিনের বেলায় ঘুম।
এই সেশনগুলি দেখানোর জন্য SleepSessionRecord ডেটার ধরন ব্যবহার করা হয়।
সেশন ব্যবহারকারীদের নির্দিষ্ট সময় ধরে সময়-ভিত্তিক পারফর্ম্যান্স পরিমাপ করতে দেয়, যেমন একটানা হার্ট রেট বা লোকেশন ডেটা।
SleepSessionRecord সেশনে এমন ডেটা থাকে যা ঘুমের বিভিন্ন পর্যায় রেকর্ড করে, যেমন
AWAKE, SLEEPING ও DEEP।
সাবটাইপ ডেটা হল এমন ডেটা যা কোনও সেশনের "অধীনস্থ" এবং এটি তখনই অর্থপূর্ণ হয় যখন সেটি মূল সেশনের সাথে পড়া হয়। যেমন, ঘুমের বিভিন্ন পর্যায়।
অন্যদিকে, সম্পর্কিত ডেটা বলতে এমন ডেটাকে বোঝায় যা স্বতন্ত্রভাবে রেকর্ড করা হয় কিন্তু সেশনের সময়সীমার মধ্যে পড়ে। যেমন, কোনও ব্যবহারকারী তার ঘুমের সেশনের সময় হার্ট রেট রেকর্ড করলে, হার্ট রেট ডেটা সম্পর্কিত ডেটা হিসেবে বিবেচিত হবে। সেশন রেকর্ডের অংশ হিসেবে থাকা সাবটাইপ ডেটার বিপরীতে, অ্যাসোসিয়েটেড ডেটাতে স্বতন্ত্র রেকর্ড থাকে, প্রত্যেকটির নিজস্ব UUID থাকে।
Health Connect-এর উপলভ্যতা চেক করা
Health Connect ব্যবহার করার চেষ্টা করার আগে, আপনার অ্যাপকে যাচাই করে নিতে হবে যে ব্যবহারকারীর ডিভাইসে Health Connect উপলভ্য
আছে কিনা। সব ডিভাইসে Health Connect আগে থেকে ইনস্টল করা নাও থাকতে পারে অথবা এটি বন্ধ করা থাকতে পারে।
আপনি HealthConnectClient.getSdkStatus()
পদ্ধতি ব্যবহার করে উপলভ্যতা চেক করতে পারবেন।
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_SLEEPandroid.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 মেনিফেস্টে ঘোষণা করা হয়েছে কিনা তা ভালো করে দেখে নিন।
val permissions = setOf( HealthPermission.getReadPermission(SleepSessionRecord::class), HealthPermission.getWritePermission(SleepSessionRecord::class) )
getGrantedPermissions
ব্যবহার করুন। তা না হলে, সেইসব অনুমতির অনুরোধ করতে
createRequestPermissionResultContract
ব্যবহার করুন। এটি Health Connect-এর অনুমতি সংক্রান্ত স্ক্রিন দেখায়।
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-এর জন্য নিম্নলিখিত অ্যাগ্রিগেট ভ্যালু উপলভ্য:
সাধারণ নির্দেশিকা
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", metadata = Metadata.activelyRecorded(device = Device(type = Device.TYPE_WATCH)) ), ) ) }
- সাবটাইপ ডেটা একটি সেশনে ক্রমিক টাইমস্ট্যাম্প সহ অ্যালাইন করতে হবে যা ওভারল্যাপ করে না। তবে, গ্যাপের অনুমতি আছে।
- সাবটাইপ ডেটাতে UUID নেই, কিন্তু সংশ্লিষ্ট ডেটাতে আলাদা আলাদা UUID আছে।
- ব্যবহারকারী যদি চান যে ডেটা কোনও সেশনের সাথে যুক্ত থাকুক (এবং সেটির অংশ হিসেবে ট্র্যাক করা হোক), তাহলে সেশন কাজে লাগে, তা না হলে ডেটা ক্রমাগত রেকর্ড করা হয়।
ঘুমের সেশন
আপনি Health Connect-এ ঘুম সংক্রান্ত ডেটা পড়তে বা লিখতে পারবেন। ঘুমের ডেটা একটি সেশন হিসেবে দেখানো হয় এবং এটিকে ৮টি আলাদা আলাদা ঘুমের পর্যায়ে ভাগ করা যায়:
UNKNOWN: ব্যবহারকারী ঘুমিয়ে থাকলে, নির্দিষ্ট করা নেই বা জানা নেই।AWAKE: ব্যবহারকারী দিনের বেলা নয়, ঘুমের চক্রের মধ্যে জেগে উঠেছেন।SLEEPING: ঘুমের সাধারণ বা অ-গ্র্যানুলার বিবরণ।OUT_OF_BED: ব্যবহারকারী ঘুমের সেশনের মাঝে বিছানা থেকে উঠে পড়েন।AWAKE_IN_BED: ব্যবহারকারী বিছানায় জেগে আছেন।LIGHT: ব্যবহারকারী হালকা ঘুমের চক্রে আছেন।DEEP: ব্যবহারকারী গভীর ঘুমের চক্রে আছেন।REM: ব্যবহারকারী র্যাপিড আই মুভমেন্ট (REM) ঘুমের চক্রে আছেন।
এইসব ভ্যালু একটি নির্দিষ্ট সময়সীমার মধ্যে ব্যবহারকারীর ঘুমের ধরনকে উপস্থাপন করে। স্লিপ স্টেজ লেখা ঐচ্ছিক, তবে উপলভ্য থাকলে সাজেস্ট করা হয়।
ঘুমের সেশন সংক্রান্ত ডেটা লেখা
SleepSessionRecord ডেটার ধরনের দুটি অংশ আছে:
- সম্পূর্ণ ঘুমের সময়সীমা জুড়ে সামগ্রিক সেশন।
- ঘুমের সেশনের সময় আলাদা আলাদা পর্যায়, যেমন হালকা ঘুম বা গভীর ঘুম।
এখানে কীভাবে পর্যায় ছাড়া স্লিপ সেশন যোগ করবেন তা দেওয়া হল:
val zoneRules = ZoneId.systemDefault().rules // Calculate the specific offset for both start and end times val startOffset = zoneRules.getOffset(startTime) val endOffset = zoneRules.getOffset(endTime) SleepSessionRecord( title = "weekend sleep", startTime = startTime, endTime = endTime, startZoneOffset = startOffset, endZoneOffset = endOffset, metadata = Metadata.activelyRecorded(device = Device(type = Device.TYPE_WATCH)) )
স্লিপ সেশনের পুরো সময়সীমা কভার করে এমন স্টেজ কীভাবে যোগ করবেন তা এখানে দেওয়া হল:
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)