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

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

হেলথ কানেক্টের প্রাপ্যতা পরীক্ষা করুন

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

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

একটি ক্লায়েন্ট ইনস্ট্যান্স তৈরি করার পরে, আপনার অ্যাপটিকে ব্যবহারকারীর কাছ থেকে অনুমতি চাইতে হবে। ব্যবহারকারীদের যেকোনো সময় অনুমতি প্রদান বা অস্বীকার করার অনুমতি দিতে হবে।

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

// Create a set of permissions for required data types
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 অনুমতিগুলির স্ক্রিন প্রদর্শন করে।

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

যেহেতু ব্যবহারকারীরা যেকোনো সময় অনুমতি দিতে বা প্রত্যাহার করতে পারেন, তাই আপনার অ্যাপকে পর্যায়ক্রমে মঞ্জুরকৃত অনুমতিগুলি পরীক্ষা করতে হবে এবং অনুমতি হারিয়ে গেলে পরিস্থিতি মোকাবেলা করতে হবে।

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

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

  • 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. সেশন চলাকালীন একটি পরিধেয় ডিভাইস দ্বারা। উদাহরণস্বরূপ, হৃদস্পন্দন। এই ডেটা কার্যকলাপের রেকর্ড টাইপ হিসাবে Health Connect-এ লেখা হয়। এই ক্ষেত্রে, HeartRateRecord
    2. সেশনের পরে ব্যবহারকারীর দ্বারা ম্যানুয়ালি। উদাহরণস্বরূপ, প্রকৃত রানের শুরু এবং শেষ নির্দেশ করে। এই ডেটা Health Connect-এ ExerciseSessionRecord হিসাবে লেখা হয়।
  5. পরবর্তী সময়ে, প্রশিক্ষণ পরিকল্পনা অ্যাপটি পরিকল্পিত অনুশীলন সেশনে ব্যবহারকারীর দ্বারা নির্ধারিত লক্ষ্যগুলির বিপরীতে প্রকৃত কর্মক্ষমতা মূল্যায়ন করার জন্য হেলথ কানেক্ট থেকে ডেটা পড়ে।

অনুশীলন পরিকল্পনা করুন এবং লক্ষ্য নির্ধারণ করুন

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

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

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

// 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.
    return
}

val plannedDuration = Duration.ofMinutes(90)
val plannedStartDate = LocalDate.now().plusDays(2)

val plannedExerciseSessionRecord = PlannedExerciseSessionRecord(
    startDate = plannedStartDate,
    duration = plannedDuration,
    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.manualEntry(
      device = Device(type = Device.Companion.TYPE_PHONE)
    )
)
val insertedPlannedExerciseSessions =
    healthConnectClient.insertRecords(listOf(plannedExerciseSessionRecord)).recordIdsList
val insertedPlannedExerciseSessionId = insertedPlannedExerciseSessions.first()

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

দুই দিন পরে, ব্যবহারকারী প্রকৃত ব্যায়াম সেশনটি লগ করে। এটি 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.manualEntry(
      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.autoRecorded(
      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"
            ),
            // ... 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
)