ट्रेनिंग के प्लान

Health Connect, फ़िटनेस और ट्रेनिंग के प्लान तैयार करने वाले ऐप्लिकेशन को प्लान की गई कसरत से जुड़ा डेटा उपलब्ध कराता है. इससे ट्रेनिंग ऐप्लिकेशन, ट्रेनिंग प्लान बना सकते हैं. साथ ही, कसरत से जुड़े ऐप्लिकेशन, ट्रेनिंग प्लान को ऐक्सेस कर सकते हैं. रिकॉर्ड की गई कसरतों (वर्कआउट) का डेटा फिर से पढ़ा जा सकता है, ताकि लोगों की परफ़ॉर्मेंस का विश्लेषण करके, ट्रेनिंग के लक्ष्यों को हासिल करने में उनकी मदद की जा सके.

यह देखना कि Health Connect मौजूद और चालू है या नहीं

Health Connect का इस्तेमाल करने से पहले, आपके ऐप्लिकेशन को यह पुष्टि करनी चाहिए कि उपयोगकर्ता के डिवाइस पर Health Connect इंस्टॉल हो. ऐसा हो सकता है कि Health Connect, सभी डिवाइसों पर पहले से इंस्टॉल न हो या इसे बंद कर दिया गया हो. HealthConnectClient.getSdkStatus() का इस्तेमाल करके, यह देखा जा सकता है कि Health Connect उपलब्ध है या नहीं.

यह देखने का तरीका कि 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

कसरत के प्लान किए गए सेशन के रिकॉर्ड में शामिल जानकारी

  • सेशन का टाइटल.
  • कसरत के प्लान किए गए ब्लॉक की सूची.
  • सेशन के शुरू और खत्म होने का समय.
  • कसरत का टाइप.
  • गतिविधि के लिए नोट.
  • मेटाडेटा.
  • कसरत के पूरे हो चुके सेशन का आईडी — यह आईडी, प्लान किए गए कसरत के सेशन से जुड़े, किसी कसरत के सेशन के पूरा होने के बाद अपने-आप लिखा जाता है.

कसरत के प्लान किए गए ब्लॉक के रिकॉर्ड में शामिल जानकारी

कसरत के प्लान किए गए ब्लॉक में, कसरत के चरणों की सूची होती है. इससे चरणों के अलग-अलग ग्रुप को दोहराने में मदद मिलती है. उदाहरण के लिए, आर्म कर्ल, बर्पी, और क्रंच को पांच बार दोहराएं.

कसरत के प्लान किए गए किसी चरण के रिकॉर्ड में शामिल जानकारी

इस्तेमाल किए जा सकने वाले एग्रीगेशन

इस डेटा टाइप के लिए, एग्रीगेशन की सुविधा उपलब्ध नहीं है.

उदाहरण उपयोग

मान लें कि किसी उपयोगकर्ता को दो दिन बाद 90 मिनट तक दौड़ लगानी है. इस दौड़ में, झील के चारों ओर तीन लैप होंगे. साथ ही, दिल की धड़कन की दर 90 से 110 बीपीएम (धड़कन प्रति मिनट) के बीच होनी चाहिए.

  1. उपयोगकर्ता, ट्रेनिंग प्लान वाले ऐप्लिकेशन में कसरत के प्लान किए गए सेशन को इस तरह से तय करता है:
    1. दौड़ के शुरू और खत्म होने का प्लान किया गया समय
    2. कसरत का टाइप (दौड़ना)
    3. लैप की संख्या (दोहराव)
    4. दिल की धड़कन की दर के लिए परफ़ॉर्मेंस टारगेट (90 से 110 बीपीएम के बीच)
  2. इस जानकारी को कसरत के ब्लॉक और चरणों में ग्रुप किया जाता है. साथ ही, ट्रेनिंग प्लान वाले ऐप्लिकेशन से इसे Health Connect में PlannedExerciseSessionRecord के तौर पर सेव किया जाता है.
  3. उपयोगकर्ता दौड़ का प्लान किया गया सेशन पूरा करता है.
  4. सेशन से जुड़ी कसरत का डेटा इनमें से किसी एक तरीके से रिकॉर्ड किया जाता है:
    1. सेशन के दौरान, पहने जाने वाले डिवाइस से. उदाहरण के लिए, धड़कन की दर. इस डेटा को Health Connect में, गतिविधि के रिकॉर्ड टाइप के तौर पर सेव किया जाता है. इस मामले में, HeartRateRecord.
    2. उपयोगकर्ता, सेशन के बाद मैन्युअल तरीके से डेटा को रिकॉर्ड करता है. उदाहरण के लिए, दौड़ शुरू और खत्म होने का समय बताना. इस डेटा को Health Connect में ExerciseSessionRecord के तौर पर सेव किया जाता है.
  5. बाद में, ट्रेनिंग प्लान ऐप्लिकेशन, Health Connect से डेटा पढ़ता है. इससे यह पता चलता है कि कसरत के प्लान किए गए सेशन में, उपयोगकर्ता ने तय किए गए टारगेट के हिसाब से कैसा परफ़ॉर्म किया.

कसरत प्लान करना और टारगेट सेट करना

कोई उपयोगकर्ता आने वाले समय में की जाने वाली कसरत का प्लान बना सकता है और उसके लिए टारगेट सेट कर सकता है. जैसे, इसे Health Connect में कसरत के प्लान किए गए सेशन के तौर पर सेव करो.

इस्तेमाल का उदाहरण में बताए गए मामले में, उपयोगकर्ता को दो दिन बाद 90 मिनट तक दौड़ लगानी है. इस दौड़ में, झील के चारों ओर तीन लैप शामिल होंगे. इसमें धड़कन की दर 90 से 110 बीपीएम के बीच होनी चाहिए.

इस तरह का स्निपेट, उस ऐप्लिकेशन के फ़ॉर्म हैंडलर में मिल सकता है जो कसरत के प्लान किए गए सेशन को 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(
        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(
        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(
        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()
)