প্রশিক্ষণ পরিকল্পনা

হেলথ কানেক্ট একটি পরিকল্পিত ব্যায়ামের ডেটা টাইপ প্রদান করে, যা ট্রেনিং অ্যাপগুলোকে ট্রেনিং প্ল্যান লিখতে এবং ওয়ার্কআউট অ্যাপগুলোকে সেই প্ল্যান পড়তে সক্ষম করে। রেকর্ড করা ব্যায়ামগুলো (ওয়ার্কআউট) ব্যক্তিগতকৃত পারফরম্যান্স বিশ্লেষণের জন্য পুনরায় পড়া যায়, যা ব্যবহারকারীদের তাদের প্রশিক্ষণের লক্ষ্য অর্জনে সহায়তা করে।

হেলথ কানেক্ট-এর প্রাপ্যতা যাচাই করুন

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

বৈশিষ্ট্যের প্রাপ্যতা

কোনো ব্যবহারকারীর ডিভাইস হেলথ কানেক্ট-এ ট্রেনিং প্ল্যান সমর্থন করে কিনা তা নির্ধারণ করতে, ক্লায়েন্টে 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>

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

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

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 ব্যবহার করুন। এটি হেলথ কানেক্ট পারমিশন স্ক্রিনটি প্রদর্শন করবে।
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.") }
    }
}
যেহেতু ব্যবহারকারীরা যেকোনো সময় অনুমতি দিতে বা প্রত্যাহার করতে পারেন, তাই আপনার অ্যাপকে প্রতিবার ব্যবহারের আগে অনুমতি যাচাই করতে হবে এবং অনুমতি হারিয়ে গেলে তার মোকাবিলা করতে হবে।

প্রশিক্ষণ পরিকল্পনাগুলো ব্যায়াম সেশনের সাথে সংযুক্ত থাকে। তাই, হেলথ কানেক্ট-এর এই বৈশিষ্ট্যটির পূর্ণাঙ্গ ব্যবহার করার জন্য ব্যবহারকারীকে একটি প্রশিক্ষণ পরিকল্পনার সাথে সম্পর্কিত প্রতিটি রেকর্ড টাইপ ব্যবহারের অনুমতি দিতে হবে।

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

  • 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

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

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

একটি পরিকল্পিত অনুশীলন ব্লক রেকর্ডে অন্তর্ভুক্ত তথ্য

একটি পরিকল্পিত ব্যায়াম ব্লকে ব্যায়ামের ধাপগুলির একটি তালিকা থাকে, যা বিভিন্ন ধাপের পুনরাবৃত্তিতে সহায়তা করে (উদাহরণস্বরূপ, পরপর পাঁচবার আর্ম কার্ল, বার্পি এবং ক্রাঞ্চ করুন)।

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

সমর্থিত সমষ্টি

এই ডেটা টাইপের জন্য কোনো সমর্থিত অ্যাগ্রিগেশন নেই।

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

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

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

ব্যায়ামের পরিকল্পনা করুন এবং লক্ষ্য নির্ধারণ করুন

একজন ব্যবহারকারী ভবিষ্যতের জন্য তার ব্যায়ামের পরিকল্পনা করতে এবং লক্ষ্য নির্ধারণ করতে পারেন। এটিকে একটি পরিকল্পিত ব্যায়াম সেশন হিসেবে হেলথ কানেক্ট-এ লিখুন।

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

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

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

ব্যায়াম এবং কার্যকলাপের তথ্য লগ করুন

দুই দিন পর, ব্যবহারকারী প্রকৃত ব্যায়াম সেশনটি লগ করেন। এটিকে হেলথ কানেক্ট-এ একটি ব্যায়াম সেশন হিসেবে লিখে রাখুন।

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

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

এখানে 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(
        device = Device(type = Device.Companion.TYPE_PHONE)
    )
)
val insertedExerciseSessions =
    healthConnectClient.insertRecords(listOf(exerciseSessionRecord))

একটি পরিধানযোগ্য ডিভাইস দৌড়ের পুরো সময় জুড়ে তাদের হৃদস্পন্দনও রেকর্ড করে। লক্ষ্যমাত্রার পরিসরের মধ্যে রেকর্ড তৈরি করতে নিম্নলিখিত কোড স্নিপেটটি ব্যবহার করা যেতে পারে।

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

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