ট্রেনিং প্ল্যান সংক্রান্ত ডেটা

ট্রেনিং অ্যাপকে ট্রেনিং প্ল্যান লিখতে এবং ওয়ার্ক-আউট অ্যাপকে ট্রেনিং প্ল্যান পড়তে দেওয়ার জন্য Health Connect পরিকল্পিত ব্যায়াম ডেটা প্রদান করে। রেকর্ড করা ব্যায়াম (ওয়ার্ক-আউট) ব্যবহারকারীদের ট্রেনিং সংক্রান্ত লক্ষ্য পূরণে সাহায্য করার জন্য পছন্দমতো পারফর্ম্যান্স বিশ্লেষণের জন্য আবার পড়া যেতে পারে।

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 ইনস্টল বা আপডেট করার ব্যাপারে গাইড করতে পারবেন।

ফিচারের উপলভ্যতা

ব্যবহারকারীর ডিভাইসে Health Connect-এ ট্রেনিং প্ল্যান কাজ করে কিনা তা নির্ধারণ করতে, ক্লায়েন্টে FEATURE_PLANNED_EXERCISE-এর উপলভ্যতা চেক করুন:

if (healthConnectClient
     .features
     .getFeatureStatus(
       HealthConnectFeatures.FEATURE_PLANNED_EXERCISE
     ) == HealthConnectFeatures.FEATURE_STATUS_AVAILABLE) {

  // Feature is available
} else {
  // Feature isn't available
}
আরও জানতে ফিচারের উপলভ্যতা চেক করুন।

প্রয়োজনীয় অনুমতি

পরিকল্পিত ব্যায়ামের অ্যাক্সেস নিম্নলিখিত অনুমতি দ্বারা সুরক্ষিত থাকে:

  • android.permission.health.READ_PLANNED_EXERCISE
  • android.permission.health.WRITE_PLANNED_EXERCISE

আপনার অ্যাপে প্ল্যান করা ব্যায়াম করার ক্ষমতা যোগ করতে, PlannedExerciseSession ডেটা ধরনের জন্য অনুমতি চেয়ে শুরু করুন।

পরিকল্পিত ব্যায়াম লেখার জন্য আপনাকে এই অনুমতি ঘোষণা করতে হবে:

<application>
  <uses-permission
android:name="android.permission.health.WRITE_PLANNED_EXERCISE" />
...
</application>

পরিকল্পিত ব্যায়াম সংক্রান্ত তথ্য পড়তে, আপনাকে নিম্নলিখিত অনুমতি দিতে হবে:

<application>
  <uses-permission
android:name="android.permission.health.READ_PLANNED_EXERCISE" />
...
</application>

ব্যবহারকারীর থেকে অনুমতি চাওয়া

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

val permissions =
    setOf(
        HealthPermission.getReadPermission(HeartRateRecord::class),
        HealthPermission.getWritePermission(HeartRateRecord::class),
        HealthPermission.getReadPermission(PlannedExerciseSessionRecord::class),
        HealthPermission.getWritePermission(PlannedExerciseSessionRecord::class),
        HealthPermission.getReadPermission(ExerciseSessionRecord::class),
        HealthPermission.getWritePermission(ExerciseSessionRecord::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.") }
    }
}
যেহেতু ব্যবহারকারীরা যেকোনও সময় অনুমতি দিতে বা প্রত্যাহার করতে পারেন, তাই আপনার অ্যাপকে প্রতিবার অনুমতি ব্যবহার করার আগে তা চেক করতে হবে এবং অনুমতি প্রত্যাহার করা হলে সেই পরিস্থিতি সামলাতে হবে।

ট্রেনিং প্ল্যান এক্সারসাইজ সেশনের সাথে লিঙ্ক করা থাকে। তাই, Health Connect-এর এই ফিচারটি সম্পূর্ণভাবে ব্যবহার করতে, ব্যবহারকারীকে ট্রেনিং প্ল্যানের সাথে সম্পর্কিত প্রতিটি রেকর্ড টাইপ ব্যবহার করার অনুমতি দিতে হবে।

যেমন, কোনও ট্রেনিং প্ল্যান যদি একাধিকবার দৌড়ানোর সময় কোনও ব্যবহারকারীর হার্ট রেট পরিমাপ করে, তাহলে ডেভেলপারকে নিম্নলিখিত অনুমতি ঘোষণা করতে হতে পারে এবং এক্সারসাইজ সেশন লেখার জন্য ব্যবহারকারীকে অনুমতি দিতে হতে পারে এবং পরবর্তী মূল্যায়ন করার জন্য ফলাফল পড়তে হতে পারে:

  • android.permission.health.READ_EXERCISE
  • android.permission.health.READ_EXERCISE_ROUTES
  • android.permission.health.READ_HEART_RATE
  • android.permission.health.WRITE_EXERCISE
  • android.permission.health.WRITE_EXERCISE_ROUTE
  • android.permission.health.WRITE_HEART_RATE

তবে, প্রায়শই যে অ্যাপ ট্রেনিং প্ল্যান তৈরি করে এবং প্ল্যান অনুযায়ী পারফর্ম্যান্স মূল্যায়ন করে, সেটি সেই অ্যাপের থেকে আলাদা হয় যেটি ট্রেনিং প্ল্যান ব্যবহার করে এবং বাস্তবিক এক্সারসাইজ ডেটা লেখে। অ্যাপের ধরনের উপর নির্ভর করে, সব রিড ও রাইট পার্মিশন প্রয়োজন হবে না। যেমন, প্রতিটি ধরনের অ্যাপের জন্য আপনার শুধুমাত্র এইসব অনুমতি প্রয়োজন হতে পারে:

ট্রেনিং প্ল্যান অ্যাপ ওয়ার্ক-আউট অ্যাপ
WRITE_PLANNED_EXERCISE READ_PLANNED_EXERCISE
READ_EXERCISE WRITE_EXERCISE
READ_EXERCISE_ROUTES WRITE_EXERCISE_ROUTE
READ_HEART_RATE WRITE_HEART_RATE

পরিকল্পিত ব্যায়াম সেশন রেকর্ডে অন্তর্ভুক্ত তথ্য

  • সেশনের শীর্ষক।
  • পরিকল্পিত ব্যায়ামের ব্লক-এর তালিকা।
  • সেশন শুরু ও শেষ হওয়ার সময়।
  • ব্যায়ামের ধরন।
  • অ্যাক্টিভিটির জন্য নোট।
  • মেটাডেটা।
  • সম্পূর্ণ হওয়া ব্যায়াম সেশনের আইডি — এই প্ল্যান করা ব্যায়াম সেশন সম্পর্কিত ব্যায়াম সেশন সম্পূর্ণ হওয়ার পরে এটি অটোমেটিক লেখা হয়।

পরিকল্পিত এক্সারসাইজ ব্লক রেকর্ডে অন্তর্ভুক্ত তথ্য

পরিকল্পিত ব্যায়ামের ব্লকে ব্যায়ামের ধাপের একটি তালিকা থাকে, যা বিভিন্ন গ্রুপের ধাপের পুনরাবৃত্তির (যেমন, বাহু বাঁকানো, বার্পি ও ক্রাঞ্চের একটি ক্রম পরপর পাঁচবার করা) ক্ষেত্রে সাহায্য করে।

পরিকল্পিত ব্যায়ামের ধাপের রেকর্ডে অন্তর্ভুক্ত তথ্য

যেসব এগ্রিগেশন কাজ করে

এই ডেটা ধরনের জন্য কোনও কাজ করে এমন এগ্রিগেশন নেই।

ব্যবহারের উদাহরণ

ধরা যাক, কোনও ব্যবহারকারী আজ থেকে দু'দিন পরে ৯০ মিনিট দৌড়ানোর পরিকল্পনা করেছেন। এই রানে একটি লেকের চারপাশে তিনটি ল্যাপ থাকবে এবং টার্গেট হার্ট রেট ৯০ থেকে ১১০ bpm-এর মধ্যে থাকবে।

  1. নিচে উল্লেখ করা বিষয়গুলি সহ একটি পরিকল্পিত ব্যায়াম সেশন ব্যবহারকারী ট্রেনিং প্ল্যান অ্যাপে সংজ্ঞায়িত করেছেন:
    1. রান শুরু ও শেষ করার পরিকল্পিত সময়
    2. ব্যায়ামের ধরন (দৌড়ানো)
    3. ল্যাপের সংখ্যা (পুনরাবৃত্তি)
    4. হার্ট রেটের পারফর্ম্যান্স টার্গেট (৯০ থেকে ১১০ bpm-এর মধ্যে)
  2. এই তথ্যকে এক্সারসাইজ ব্লক ও স্টেপ হিসেবে গ্রুপ করা হয় এবং ট্রেনিং প্ল্যান অ্যাপ Health Connect-এ এগুলি PlannedExerciseSessionRecord হিসেবে লেখে।
  3. ব্যবহারকারী প্ল্যান করা সেশন পারফর্ম করেন (চলছে)।
  4. সেশন সম্পর্কিত ব্যায়ামের ডেটা এগুলির মধ্যে কোনও একটি হিসেবে রেকর্ড করা হয়:
    1. সেশন চলাকালীন পরে থাকা যায় এমন ডিভাইসের মাধ্যমে। যেমন, হার্ট রেট। এই ডেটা Health Connect-এ অ্যাক্টিভিটির রেকর্ড টাইপ হিসেবে লেখা হয়। এই ক্ষেত্রে, HeartRateRecord.
    2. সেশন শেষ হওয়ার পরে ব্যবহারকারী ম্যানুয়ালি। যেমন, আসল রান শুরু ও শেষ হওয়ার সময় উল্লেখ করা। এই ডেটা Health Connect-এ ExerciseSessionRecord হিসেবে লেখা হয়।
  5. পরবর্তী কোনও সময়ে, ট্রেনিং প্ল্যান অ্যাপ Health Connect থেকে ডেটা পড়ে পরিকল্পিত ব্যায়াম সেশনে ব্যবহারকারীর সেট করা টার্গেটের তুলনায় আসল পারফর্ম্যান্স মূল্যায়ন করে।

এক্সারসাইজ প্ল্যান করা ও টার্গেট সেট করা

ব্যবহারকারী ভবিষ্যতে ব্যায়াম করার পরিকল্পনা করতে এবং টার্গেট সেট করতে পারেন। এটি Health Connect-এ একটি পরিকল্পিত এক্সারসাইজ সেশন হিসেবে লেখো।

ব্যবহারের উদাহরণ-এ বর্ণিত উদাহরণে, ব্যবহারকারী এখন থেকে দু'দিন পরে ৯০ মিনিটের রান প্ল্যান করছেন। এই রানে একটি লেকের চারপাশে তিনটি ল্যাপ থাকবে এবং টার্গেট হার্ট রেট ৯০ থেকে ১১০ bpm-এর মধ্যে থাকবে।

Health Connect-এ প্ল্যান করা এক্সারসাইজ সেশন লগ করে এমন অ্যাপের ফর্ম হ্যান্ডলারে এই ধরনের স্নিপেট পাওয়া যেতে পারে। এছাড়াও, এটি ইন্টিগ্রেশনের জন্য ইনজেস্ট পয়েন্টে পাওয়া যেতে পারে, যেমন, ট্রেনিং অফার করে এমন কোনও পরিষেবার সাথে।

// Verify the user has granted all necessary permissions for this task
val grantedPermissions =
    healthConnectClient.permissionController.getGrantedPermissions()

if (!grantedPermissions.contains(
        HealthPermission.getWritePermission(PlannedExerciseSessionRecord::class))) {
    // The user hasn't granted the app permission to write planned exercise session data.
    Log.w("HealthConnect", "Write permission for PlannedExerciseSessionRecord not granted.")
    return
}

val plannedExerciseSessionRecord = PlannedExerciseSessionRecord(
    startTime = startTime,
    endTime = endTime,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
    blocks = listOf(
        PlannedExerciseBlock(
            repetitions = 1, steps = listOf(
                PlannedExerciseStep(
                    exerciseType = ExerciseSegment.EXERCISE_SEGMENT_TYPE_RUNNING,
                    exercisePhase = PlannedExerciseStep.EXERCISE_PHASE_ACTIVE,
                    completionGoal = ExerciseCompletionGoal.RepetitionsGoal(repetitions = 3),
                    performanceTargets = listOf(
                        ExercisePerformanceTarget.HeartRateTarget(
                            minHeartRate = 90.0, maxHeartRate = 110.0
                        )
                    )
                ),
            ), description = "Three laps around the lake"
        )
    ),
    title = "Run at lake",
    notes = null,
    metadata = Metadata.activelyRecorded(
        device = Device(type = Device.Companion.TYPE_PHONE),
    ),
    startZoneOffset = null,
    endZoneOffset = null,
)

try {
    // Attempt to insert the record
    val response = healthConnectClient.insertRecords(listOf(plannedExerciseSessionRecord))

    // If execution reaches here, the insert succeeded.
    // Safely extract the ID using firstOrNull()
    val insertedPlannedExerciseSessionId = response.recordIdsList.firstOrNull()

    if (insertedPlannedExerciseSessionId != null) {
        Log.d("HealthConnect", "Successfully inserted planned exercise session ID: $insertedPlannedExerciseSessionId")
    } else {
        Log.w("HealthConnect", "Insertion succeeded but no record IDs were returned.")
    }

} catch (e: Exception) {
    // Handle API failures, database errors, or system issues safely without crashing
    Log.e("HealthConnect", "Failed to insert planned exercise session record", e)
}

এক্সারসাইজ ও অ্যাক্টিভিটি ডেটা লগ করা

দুদিন পরে, ব্যবহারকারী আসল এক্সারসাইজ সেশন লগ করেন। এটি Health Connect-এ এক্সারসাইজ সেশন হিসেবে লিখুন।

এই উদাহরণে, ব্যবহারকারীর সেশনের সময়সীমা ঠিক পরিকল্পিত সময়সীমার সমান।

Health Connect-এ এক্সারসাইজ সেশন লগ করে এমন অ্যাপের ফর্ম হ্যান্ডলারে নিম্নলিখিত স্নিপেটটি পাওয়া যেতে পারে। এছাড়াও, এটি ডেটা ইনজেস্ট এবং এক্সপোর্ট হ্যান্ডলারের মধ্যে পাওয়া যেতে পারে যা এক্সারসাইজ সেশন শনাক্ত ও লগ করতে পারে এমন পরে থাকা যায় এমন ডিভাইস।

insertedPlannedExerciseSessionId এখানে আগের উদাহরণ থেকে আবার ব্যবহার করা হয়েছে। বাস্তবে কোনও অ্যাপে, আগে থেকে থাকা সেশনের তালিকা থেকে ব্যবহারকারী কোনও প্ল্যান করা ব্যায়ামের সেশন বেছে নিলে আইডি নির্ধারণ করা হবে।

// Verify the user has granted all necessary permissions for this task
val grantedPermissions =
    healthConnectClient.permissionController.getGrantedPermissions()
if (!grantedPermissions.contains(
        HealthPermission.getWritePermission(ExerciseSessionRecord::class))) {
    // The user doesn't granted the app permission to write exercise session data.
    return
}

val sessionDuration = Duration.ofMinutes(90)
val sessionEndTime = Instant.now()
val sessionStartTime = sessionEndTime.minus(sessionDuration)

val exerciseSessionRecord = ExerciseSessionRecord(
    startTime = sessionStartTime,
    startZoneOffset = ZoneOffset.UTC,
    endTime = sessionEndTime,
    endZoneOffset = ZoneOffset.UTC,
    exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_RUNNING,
    segments = listOf(
        ExerciseSegment(
            startTime = sessionStartTime,
            endTime = sessionEndTime,
            repetitions = 3,
            segmentType = ExerciseSegment.EXERCISE_SEGMENT_TYPE_RUNNING
        )
    ),
    title = "Run at lake",
    plannedExerciseSessionId = insertedPlannedExerciseSessionId,
    metadata = Metadata.activelyRecorded(
        device = Device(type = Device.Companion.TYPE_PHONE)
    )
)
val insertedExerciseSessions =
    healthConnectClient.insertRecords(listOf(exerciseSessionRecord))

এছাড়াও, রান চলাকালীন হার্ট রেটও পরিধানযোগ্য ডিভাইসে লগ করা হয়। টার্গেট রেঞ্জের মধ্যে রেকর্ড জেনারেট করতে নিচে দেওয়া স্নিপেট ব্যবহার করা যেতে পারে।

বাস্তবিক অ্যাপে, এই স্নিপেটের প্রাথমিক অংশগুলি পরিধানযোগ্য ডিভাইস থেকে প্রাপ্ত মেসেজের হ্যান্ডলারে পাওয়া যেতে পারে, যা সংগ্রহ করার পরে Health Connect-এ মেজারমেন্ট লিখবে।

// Verify the user has granted all necessary permissions for this task
val grantedPermissions =
    healthConnectClient.permissionController.getGrantedPermissions()
if (!grantedPermissions.contains(
        HealthPermission.getWritePermission(HeartRateRecord::class))) {
    // The user doesn't granted the app permission to write heart rate record data.
    return
}

val samples = mutableListOf<HeartRateRecord.Sample>()
var currentTime = sessionStartTime
while (currentTime.isBefore(sessionEndTime)) {
    val bpm = Random.nextInt(21) + 90
    val heartRateRecord = HeartRateRecord.Sample(
        time = currentTime,
        beatsPerMinute = bpm.toLong(),
    )
    samples.add(heartRateRecord)
    currentTime = currentTime.plusSeconds(180)
}

val heartRateRecord = HeartRateRecord(
    startTime = sessionStartTime,
    startZoneOffset = ZoneOffset.UTC,
    endTime = sessionEndTime,
    endZoneOffset = ZoneOffset.UTC,
    samples = samples,
    metadata = Metadata.activelyRecorded(
        device = Device(type = Device.Companion.TYPE_WATCH)
    )
)
val insertedHeartRateRecords = healthConnectClient.insertRecords(listOf(heartRateRecord))

পারফর্ম্যান্স টার্গেট মূল্যায়ন করা

ব্যবহারকারীর ওয়ার্ক-আউটের পরের দিন, আপনি লগ করা ব্যায়াম পুনরুদ্ধার করতে, কোনও পরিকল্পিত ব্যায়াম টার্গেট আছে কিনা তা চেক করতে এবং সেট করা টার্গেট পূরণ করা হয়েছে কিনা তা নির্ধারণ করতে অতিরিক্ত ডেটার ধরন মূল্যায়ন করতে পারবেন।

এই ধরনের স্নিপেট সম্ভবত পারফর্ম্যান্স টার্গেট মূল্যায়ন করার জন্য কোনও পিরিয়ডিক জবে অথবা এক্সারসাইজের তালিকা লোড করার সময় এবং অ্যাপে পারফর্ম্যান্স টার্গেট সম্পর্কে বিজ্ঞপ্তি দেখানোর সময় পাওয়া যাবে।

    // Verify the user has granted all necessary permissions for this task
    val grantedPermissions =
        healthConnectClient.permissionController.getGrantedPermissions()
    if (!grantedPermissions.containsAll(
            listOf(
                HealthPermission.getReadPermission(ExerciseSessionRecord::class),
                HealthPermission.getReadPermission(PlannedExerciseSessionRecord::class),
                HealthPermission.getReadPermission(HeartRateRecord::class)
            )
        )
    ) {
        // The user doesn't granted the app permission to read exercise session record data.
        return
    }

    val searchDuration = Duration.ofDays(1)
    val searchEndTime = Instant.now()
    val searchStartTime = searchEndTime.minus(searchDuration)

    val response = healthConnectClient.readRecords(
        ReadRecordsRequest<ExerciseSessionRecord>(
            timeRangeFilter = TimeRangeFilter.between(searchStartTime, searchEndTime)
        )
    )
    for (exerciseRecord in response.records) {
        val plannedExerciseRecordId = exerciseRecord.plannedExerciseSessionId
        val plannedExerciseRecord =
            if (plannedExerciseRecordId == null) null else healthConnectClient.readRecord(
                PlannedExerciseSessionRecord::class, plannedExerciseRecordId
            ).record
        if (plannedExerciseRecord != null) {
            val aggregateRequest = AggregateRequest(
                metrics = setOf(HeartRateRecord.BPM_AVG),
                timeRangeFilter = TimeRangeFilter.between(
                    exerciseRecord.startTime, exerciseRecord.endTime
                ),
            )
            val aggregationResult = healthConnectClient.aggregate(aggregateRequest)

            val maxBpm = aggregationResult[HeartRateRecord.BPM_MAX]
            val minBpm = aggregationResult[HeartRateRecord.BPM_MIN]
            if (maxBpm != null && minBpm != null) {
                plannedExerciseRecord.blocks.forEach { block ->
                    block.steps.forEach { step ->
                        step.performanceTargets.forEach { target ->
                            when (target) {
                                is ExercisePerformanceTarget.HeartRateTarget -> {
                                    val minTarget = target.minHeartRate
                                    val maxTarget = target.maxHeartRate
                                    if(
                                        minBpm >= minTarget && maxBpm <= maxTarget
                                    ) {
                                        // Success!
                                    }
                                }
                                // Handle more target types
                            }
                        }
                    }
                }
            }
        }
    }
}

ব্যায়াম সেশন

দৌড়ানো থেকে ব্যাডমিন্টন পর্যন্ত যেকোনও কিছু ব্যায়াম সেশনে অন্তর্ভুক্ত থাকতে পারে।

ব্যায়াম সেশন সংক্রান্ত ডেটা লেখা

সেশন সহ একটি ইনসার্শন অনুরোধ কীভাবে তৈরি করতে হয় তা এখানে দেওয়া হল:

suspend fun writeExerciseSession(healthConnectClient: HealthConnectClient) {
    healthConnectClient.insertRecords(
        listOf(
            ExerciseSessionRecord(
                startTime = START_TIME,
                startZoneOffset = START_ZONE_OFFSET,
                endTime = END_TIME,
                endZoneOffset = END_ZONE_OFFSET,
                exerciseType = ExerciseSessionRecord.ExerciseType.RUNNING,
                title = "My Run",
                metadata = Metadata.manualEntry()
            ),
            // ... other records
        )
    )
}

ব্যায়াম সেশন সংক্রান্ত ডেটা পড়া

এক্সারসাইজ সেশন কীভাবে পড়তে হয় তার একটি উদাহরণ এখানে দেওয়া হল:

suspend fun readExerciseSessions(
    healthConnectClient: HealthConnectClient,
    startTime: Instant,
    endTime: Instant
) {
    val response =
        healthConnectClient.readRecords(
            ReadRecordsRequest(
                ExerciseSessionRecord::class,
                timeRangeFilter = TimeRangeFilter.between(startTime, endTime)
            )
        )
    for (exerciseRecord in response.records) {
        // Process each exercise record
        // Optionally pull in with other data sources of the same time range.
        val distanceRecord =
            healthConnectClient
                .readRecords(
                    ReadRecordsRequest(
                        DistanceRecord::class,
                        timeRangeFilter =
                            TimeRangeFilter.between(
                                exerciseRecord.startTime,
                                exerciseRecord.endTime
                            )
                    )
                )
                .records
    }
}

সাবটাইপ ডেটা লেখা

সেশনে ঐচ্ছিক সাবটাইপ ডেটাও থাকতে পারে, যা অতিরিক্ত তথ্য দিয়ে সেশনকে আরও সমৃদ্ধ করে।

যেমন, ব্যায়াম সেশনে ExerciseSegment, ExerciseLap ও ExerciseRoute ক্লাস অন্তর্ভুক্ত থাকতে পারে:

val segments = listOf(
  ExerciseSegment(
    startTime = Instant.parse("2022-01-02T10:10:10Z"),
    endTime = Instant.parse("2022-01-02T10:10:13Z"),
    segmentType = ActivitySegmentType.BENCH_PRESS,
    repetitions = 373
  )
)

val laps = listOf(
  ExerciseLap(
    startTime = Instant.parse("2022-01-02T10:10:10Z"),
    endTime = Instant.parse("2022-01-02T10:10:13Z"),
    length = 0.meters
  )
)

ExerciseSessionRecord(
  exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_CALISTHENICS,
    startTime = Instant.parse("2022-01-02T10:10:10Z"),
    endTime = Instant.parse("2022-01-02T10:10:13Z"),
  startZoneOffset = ZoneOffset.UTC,
  endZoneOffset = ZoneOffset.UTC,
  segments = segments,
  laps = laps,
  route = route,
  metadata = Metadata.manualEntry()
)