StepsRecord ব্যবহার করে ধাপের সংখ্যা রেকর্ড করার জন্য Health Connect ধাপ ডেটা ধরন প্রদান করে।
স্বাস্থ্য
ও ফিটনেস ট্র্যাকিংয়ের ক্ষেত্রে পদক্ষেপ হল একটি মৌলিক পরিমাপ।
মোবাইল স্টেপ রিডিং
Android 14 (API লেভেল 34) এবং SDK এক্সটেনশন ভার্সন 20 বা তার পরের যেকোনও ভার্সনে,
Health Connect ডিভাইসে স্টেপ গণনা করার সুবিধা প্রদান করে। কোনও অ্যাপকে READ_STEPS অনুমতি দেওয়া হলে, Health Connect
Android-পরিচালিত ডিভাইস থেকে স্টেপ ক্যাপচার করা শুরু করে এবং ব্যবহারকারীরা Health Connect-এ
অটোমেটিক যোগ করা স্টেপ এন্ট্রি দেখতে পান।
ডিভাইসে স্টেপ কাউন্টিং উপলভ্য আছে কিনা তা চেক করতে, ডিভাইসটি Android 14 (API লেভেল 34) ভার্সনে চলছে কিনা এবং এতে অন্তত SDK এক্সটেনশন ভার্সন 20 আছে কিনা তা যাচাই করুন:
val isStepTrackingAvailable =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE &&
SdkExtensions.getExtensionVersion(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) >= 20
আপনার অ্যাপ যদি
aggregate ব্যবহার করে মোট ধাপের সংখ্যা পড়ে এবং DataOrigin অনুযায়ী ফিল্টার না করে, তাহলে ডিভাইসে
ধাপের সংখ্যা অটোমেটিক মোট সংখ্যার মধ্যে অন্তর্ভুক্ত করা হয় এবং জুন, ২০২৬ আপডেট করার জন্য
কোনও পরিবর্তন করার প্রয়োজন নেই।
অন-ডিভাইস ধাপের জন্য অ্যাট্রিবিউশন পরিবর্তন
জুন ২০২৬ আপডেট থেকে, Health Connect-এর মাধ্যমে ট্র্যাক করা পদক্ষেপগুলি
সিন্থেটিক প্যাকেজ নামের (SPN) সাথে অ্যাট্রিবিউট করা হয়, যেমন
com.android.healthconnect.phone.jd5bdd37e1a8d3667a05d0abebfc4a89e।
আগে, বিল্ট-ইন ধাপগুলি প্যাকেজের নাম android-এর সাথে অ্যাট্রিবিউট করা হত।
জুন ২০২৬-এর আগে রেকর্ড করা ঐতিহাসিক ধাপের ডেটা android প্যাকেজ
নাম ধরে রাখে।
SPN ডিভাইস-নির্দিষ্ট এবং ব্যবহারকারীর গোপনীয়তা সুরক্ষিত রাখতে প্রতিটি অ্যাপ্লিকেশনের ভিত্তিতে স্কোপ করা হয়:
- স্থিতিশীল: বর্তমান ডিভাইসের SPN আপনার অ্যাপ্লিকেশনের জন্য স্থিতিশীল।
- অ্যাপ্লিকেশন-স্কোপ: একই ডিভাইসে থাকা আলাদা আলাদা অ্যাপ্লিকেশন, ডিভাইসে সেভ করা স্টেপ ডেটার জন্য আলাদা আলাদা SPN দেখতে পায়।
অন-ডিভাইস ধাপের জন্য কোয়েরি করা
SPN স্কোপ ও ডিভাইস-নির্দিষ্ট হওয়ার কারণে, আপনাকে অবশ্যই SPN
ভ্যালু হার্ডকোড করা চলবে না। পরিবর্তে, বর্তমান ডিভাইসের SPN পেতে getCurrentDeviceDataSource() API ব্যবহার করুন।
ডিভাইসে স্টেপ গণনা করার জন্য SDK এক্সটেনশন ভার্সন ২০ বা তার পরবর্তী যেকোনও ভার্সন প্রয়োজন হলেও,
getCurrentDeviceDataSource() API, SDK এক্সটেনশন ভার্সন ১১ বা তার পরবর্তী যেকোনও ভার্সনের সাথে Android 14 (API লেভেল
৩৪)-এ উপলভ্য।
getCurrentDeviceDataSource() API এখনও Health
Connect Jetpack লাইব্রেরিতে উপলভ্য নেই। নিম্নলিখিত উদাহরণে Android ফ্রেমওয়ার্ক API
ব্যবহার করা হয়েছে:
import android.content.Context
import android.health.connect.HealthConnectManager
val healthConnectManager = context.getSystemService(HealthConnectManager::class.java)
val deviceDataSource = healthConnectManager?.getCurrentDeviceDataSource()
val currentDeviceSpn = deviceDataSource?.deviceDataOrigin?.packageName
আপনার অ্যাপকে যদি ডিভাইসে সেভ করা ধাপ পড়তে হয় অথবা এটি যদি সোর্স অ্যাপ্লিকেশন বা ডিভাইস অনুযায়ী
ভাগ করা ধাপের ডেটা দেখায়, তাহলে আপনাকে অবশ্যই এমন রেকর্ড কোয়েরি করতে হবে
যেখানে DataOrigin android অথবা ডিভাইসের SPN-এর সাথে ম্যাচ করে। আপনার অ্যাপে
স্টেপ ডেটার জন্য অ্যাট্রিবিউশন দেখালে, স্বতন্ত্র রেকর্ড
এর জন্য সোর্স ডিভাইস শনাক্ত করতে metadata.device ব্যবহার করুন। অ্যাগ্রিগেট করা ডেটাতে SPN দ্বারা শনাক্ত করা
অন-ডিভাইস ধাপের জন্য, অ্যাট্রিবিউশনের জন্য আপনি DeviceDataSource থেকে
model বা manufacturer-এর মতো ডিভাইস মেটাডেটা ব্যবহার করতে পারেন অথবা অন-ডিভাইস ধাপের জন্য "আপনার ফোন"-এর মতো জেনেরিক লেবেল ব্যবহার করতে পারেন।
android ও বর্তমান ডিভাইসের SPN, দু'টির জন্য ফিল্টার করে কীভাবে ডিভাইসে সেভ করা মোট ধাপের সংখ্যা সংক্রান্ত ডেটা পড়তে হয় তা নিচের উদাহরণে দেখানো হয়েছে:
import android.content.Context
import android.health.connect.HealthConnectManager
import android.os.Build
import android.os.ext.SdkExtensions
import androidx.health.connect.client.HealthConnectClient
import androidx.health.connect.client.records.StepsRecord
import androidx.health.connect.client.records.metadata.DataOrigin
import androidx.health.connect.client.request.AggregateRequest
import androidx.health.connect.client.time.TimeRangeFilter
import java.time.Instant
suspend fun readDeviceStepsByTimeRange(
healthConnectClient: HealthConnectClient,
context: Context,
startTime: Instant,
endTime: Instant
) {
// 1. Check if SDK Extension 11+ is available for getCurrentDeviceDataSource()
val isDataSourceApiAvailable = Build.VERSION.SDK_INT >= Build.VERSION_CODES.U &&
SdkExtensions.getExtensionVersion(Build.VERSION_CODES.U) >= 11
try {
val healthConnectManager = context.getSystemService(HealthConnectManager::class.java)
// 2. Safely fetch the package name only if API is available and data exists
val currentDeviceSpn = if (isDataSourceApiAvailable) {
healthConnectManager?.getCurrentDeviceDataSource()?.deviceDataOrigin?.packageName
} else {
null
}
val dataOriginFilters = mutableSetOf(DataOrigin("android"))
// 3. Explicit null-safety check using .let
currentDeviceSpn?.let {
dataOriginFilters.add(DataOrigin(it))
}
val response = healthConnectClient.aggregate(
AggregateRequest(
metrics = setOf(StepsRecord.COUNT_TOTAL),
timeRangeFilter = TimeRangeFilter.between(startTime, endTime),
dataOriginFilter = dataOriginFilters
)
)
val stepCount = response[StepsRecord.COUNT_TOTAL]
} catch (e: Exception) {
// Now this catch block only handles actual runtime exceptions,
// rather than Errors from missing methods.
}
}
ডিভাইসে স্টেপ গণনা করা
- সেন্সর ব্যবহার: Health Connect
SensorManagerথেকেTYPE_STEP_COUNTERসেন্সর ব্যবহার করে। এই সেন্সরটি কম বিদ্যুৎ খরচ করার জন্য অপ্টিমাইজ করা হয়েছে, এটি নিরবচ্ছিন্ন ব্যাকগ্রাউন্ড স্টেপ ট্র্যাকিংয়ের জন্য আদর্শ। - ডেটা গ্র্যানুলারিটি: ব্যাটারির আয়ু বাঁচানোর জন্য, স্টেপ ডেটা সাধারণত ব্যাচ করা হয় এবং Health Connect ডেটাবেসে এক মিনিটের মধ্যে একবারের বেশি লেখা হয় না।
- অ্যাট্রিবিউশন: জুন ২০২৬-এর আগে এই ফিচারের রেকর্ড করা ধাপগুলি
DataOrigin-এandroidপ্যাকেজ নামের সাথে অ্যাট্রিবিউট করা হয়। এই তারিখের পরে, সেগুলি ডিভাইস-নির্দিষ্ট SPN-এর সাথে অ্যাট্রিবিউট করা হয়। অন-ডিভাইস স্টেপের জন্য অ্যাট্রিবিউশন পরিবর্তন দেখুন। - অ্যাক্টিভেশন: ডিভাইসে থাকা স্টেপ গণনা করার মেকানিজম তখনই অ্যাক্টিভ থাকে যখন ডিভাইসে অন্তত একটি অ্যাপ্লিকেশনকে Health Connect-এর মধ্যে
READ_STEPSঅনুমতি দেওয়া হয়।
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_STEPSandroid.permission.health.WRITE_STEPS
আপনার অ্যাপে ধাপ যোগ করার সুবিধা যোগ করতে, Steps ডেটা
টাইপের জন্য অনুমতি চেয়ে শুরু করুন।
ধাপ লেখার জন্য আপনাকে এই অনুমতি ঘোষণা করতে হবে:
<application>
<uses-permission
android:name="android.permission.health.WRITE_STEPS" />
...
</application>
ধাপগুলি পড়তে, আপনাকে নিম্নলিখিত অনুমতিগুলির জন্য অনুরোধ করতে হবে:
<application>
<uses-permission
android:name="android.permission.health.READ_STEPS" />
...
</application>
ব্যবহারকারীর থেকে অনুমতি চাওয়া
ক্লায়েন্ট ইনস্ট্যান্স তৈরি করার পরে, আপনার অ্যাপকে ব্যবহারকারীর কাছে অনুমতি চেয়ে অনুরোধ করতে হবে। ব্যবহারকারীদের যেকোনও সময় অনুমতি দেওয়া বা প্রত্যাহার করার সুবিধা দিতে হবে। এটি করতে, প্রয়োজনীয় ডেটার ধরনের জন্য অনুমতির একটি সেট তৈরি করুন। সেটে থাকা অনুমতিগুলি প্রথমে আপনার Android মেনিফেস্টে ঘোষণা করা হয়েছে কিনা তা ভালো করে দেখে নিন।
val permissions = setOf( HealthPermission.getReadPermission(StepsRecord::class), HealthPermission.getWritePermission(StepsRecord::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.") } } }
'ধাপ' রেকর্ডে অন্তর্ভুক্ত তথ্য
প্রতিটি StepsRecord-এ নিম্নলিখিত তথ্য থাকে:
count: সময়সীমার মধ্যে নেওয়া ধাপের সংখ্যা,Longহিসেবে।startTime: পরিমাপের ইন্টার্ভালের শুরুর সময়।endTime: পরিমাপের ইন্টার্ভাল শেষ হওয়ার সময়।startZoneOffset: শুরুর সময়ের জন্য জোন অফসেট।endZoneOffset: শেষ হওয়ার সময়ের জন্য জোন অফসেট।
যেসব এগ্রিগেশন কাজ করে
StepsRecord-এর জন্য নিম্নলিখিত অ্যাগ্রিগেট ভ্যালু উপলভ্য:
StepsCadenceRecord-এর জন্য নিম্নলিখিত অ্যাগ্রিগেট ভ্যালু উপলভ্য:
ব্যবহারের উদাহরণ
StepsRecord ডেটা কীভাবে পড়তে ও লিখতে হয় তা নিম্নলিখিত বিভাগে দেখানো হয়েছে।
হাঁটা সংক্রান্ত ডেটা লেখা
আপনার অ্যাপ StepsRecord
ইনস্ট্যান্স যোগ করে ধাপ গণনা সংক্রান্ত ডেটা লিখতে পারে। নিচের উদাহরণে দেখানো হয়েছে যে কীভাবে কোনও ব্যবহারকারীর নেওয়া ১০০০টি ধাপ রেকর্ড করতে হয়:
val zoneOffset = ZoneOffset.systemDefault().rules.getOffset(startTime) val stepsRecord = StepsRecord( count = 120, startTime = startTime, endTime = endTime, startZoneOffset = zoneOffset, endZoneOffset = zoneOffset, metadata = Metadata.autoRecorded( device = Device(type = Device.TYPE_WATCH) ) ) healthConnectClient.insertRecords(listOf(stepsRecord))
মোট ডেটা পড়া
স্টেপ ডেটা পড়ার সবচেয়ে সাধারণ উপায় হল একটি সময়সীমার মধ্যে মোট স্টেপ একত্রিত করা। নিচের উদাহরণে দেখানো হয়েছে যে কীভাবে নির্দিষ্ট সময়সীমার মধ্যে কোনও ব্যবহারকারীর মোট ধাপের সংখ্যা পড়তে হয়:
suspend fun readStepsAggregate(startTime: Instant, endTime: Instant): Long { val response = healthConnectClient.aggregate( AggregateRequest( metrics = setOf(StepsRecord.COUNT_TOTAL), timeRangeFilter = TimeRangeFilter.between(startTime, endTime) ) ) return response[StepsRecord.COUNT_TOTAL] ?: 0L }
প্রসেস না করা ডেটা পড়া
নিম্নলিখিত উদাহরণে দেখানো হয়েছে কীভাবে শুরু ও শেষ হওয়ার সময়ের মধ্যেকার কাঁচা StepsRecord ডেটা
পড়তে হয়:
val response = healthConnectClient.readRecords( ReadRecordsRequest( StepsRecord::class, timeRangeFilter = TimeRangeFilter.between(startTime, endTime) ) ) response.records.forEach { record -> /* Process records */ }