ব্যায়াম রুট যোগ করুন

এই নির্দেশিকাটি Health Connect সংস্করণ 1.1.0-alpha12 এর সাথে সামঞ্জস্যপূর্ণ।

ব্যায়াম রুট ব্যবহারকারীদের সংশ্লিষ্ট ব্যায়াম ক্রিয়াকলাপের জন্য একটি GPS রুট ট্র্যাক করতে এবং অন্যান্য অ্যাপের সাথে তাদের ওয়ার্কআউটের মানচিত্র শেয়ার করতে দেয়।

এই নির্দেশিকাটি কীভাবে ব্যবহারকারীর কাছ থেকে অনুমতির অনুরোধ করতে হয় সে সম্পর্কে তথ্য প্রদান করে এবং ব্যায়াম সেশনের অংশ হিসাবে অ্যাপগুলি কীভাবে রুট ডেটা লেখার অনুমতি পায় তার রূপরেখা দেয়।

এখানে ব্যায়াম রুটের জন্য পড়া এবং লেখার কার্যকারিতার একটি সংক্ষিপ্ত সারাংশ রয়েছে:

  1. অ্যাপ্লিকেশানগুলি ব্যায়াম রুটের জন্য একটি নতুন লেখার অনুমতি তৈরি করে৷
  2. ক্ষেত্র হিসাবে একটি রুট সহ একটি অনুশীলন সেশন লিখে সন্নিবেশ ঘটে।
  3. পড়া:
    1. সেশনের মালিকের জন্য, সেশন রিড ব্যবহার করে ডেটা অ্যাক্সেস করা হয়।
    2. একটি থার্ড-পার্টি অ্যাপ থেকে, একটি ডায়ালগের মাধ্যমে যা ব্যবহারকারীকে একটি রুট একবার পড়ার অনুমতি দেয়।

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

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

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

// Create a set of permissions for required data types
val PERMISSIONS =
    setOf(
  HealthPermission.getReadPermission(ExerciseSessionRecord::class),
  HealthPermission.getWritePermission(ExerciseSessionRecord::class)
)

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

// 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.WRITE_EXERCISE_ROUTE )।

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

আপনাকে একটি ব্যায়ামের অনুমতিও ঘোষণা করতে হবে, কারণ প্রতিটি রুট একটি ব্যায়াম সেশনের সাথে যুক্ত (এক সেশন = একটি ওয়ার্কআউট)।

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

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

ব্যায়ামের রুট পড়তে, আপনাকে নিম্নলিখিত অনুমতিগুলির জন্য অনুরোধ করতে হবে:

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

অনুমতির জন্য অনুরোধ করতে, যখন আপনি প্রথমবার আপনার অ্যাপকে Health Connect-এর সাথে সংযুক্ত করবেন তখন PermissionController.createRequestPermissionResultContract() পদ্ধতি ব্যবহার করুন। আপনি অনুরোধ করতে চাইতে পারেন যে কয়েকটি অনুমতি হল:

  • রুট ডেটা সহ স্বাস্থ্য ডেটা পড়ুন: HealthPermission.getReadPermission(ExerciseSessionRecord::class)
  • রুট ডেটা সহ স্বাস্থ্য ডেটা লিখুন: HealthPermission.getWritePermission(ExerciseSessionRecord::class)
  • ব্যায়াম রুট ডেটা লিখুন: HealthPermission.PERMISSION_WRITE_EXERCISE_ROUTE

রুট ডেটা পড়ুন এবং লিখুন

Apps একটি ক্ষেত্র হিসাবে একটি রুট সহ একটি সেশন লিখে একটি রুট সন্নিবেশ করান৷

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

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

যখনই আপনার অ্যাপের কোনো তৃতীয় পক্ষের অ্যাপ দ্বারা প্রদত্ত রুট ডেটা পড়ার প্রয়োজন হয়, তখন একটি ডায়ালগ প্রদর্শিত হয় যা ব্যবহারকারীকে রিড অপারেশনের অনুমতি দিতে বলে।

একটি অধিবেশন থেকে একটি রুট অনুরোধ

হেলথ কানেক্টে একটি সেশন কীভাবে পড়তে হয় এবং সেই সেশন থেকে একটি রুটের অনুরোধ করতে হয় তা এখানে:

suspend fun readExerciseSessionAndRoute() {
    val endTime = Instant.now()
    val startTime = endTime.minus(Duration.ofHours(1))

    val grantedPermissions =
        healthConnectClient.permissionController.getGrantedPermissions()
    if (!grantedPermissions.contains(
          HealthPermission.getReadPermission(ExerciseSessionRecord::class))) {
        // The user doesn't allow the app to read exercise session data.
        return
    }

    val readResponse =
      healthConnectClient.readRecords(
        ReadRecordsRequest(
          ExerciseSessionRecord::class,
          TimeRangeFilter.between(startTime, endTime)
        )
      )
    val exerciseRecord = readResponse.records.first()
    val recordId = exerciseRecord.metadata.id

    // See https://developer.android.com/training/basics/intents/result#launch
    // for appropriately handling ActivityResultContract.
    val requestExerciseRouteLauncher = fragment.registerForActivityResul
    (ExerciseRouteRequestContract()) { exerciseRoute: ExerciseRoute? ->
            if (exerciseRoute != null) {
                displayExerciseRoute(exerciseRoute)
            } else {
                // Consent was denied
            }
        }

    val exerciseSessionRecord =
      healthConnectClient.readRecord(ExerciseSessionRecord::class, recordId).record

    when (val exerciseRouteResult = exerciseSessionRecord.exerciseRouteResult) {
        is ExerciseRouteResult.Data ->
            displayExerciseRoute(exerciseRouteResult.exerciseRoute)
        is ExerciseRouteResult.ConsentRequired ->
            requestExerciseRouteLauncher.launch(recordId)
        is ExerciseRouteResult.NoData -> Unit // No exercise route to show
        else -> Unit
    }
  }

  fun displayExerciseRoute(route: ExerciseRoute?) {
    val locations = route.route.orEmpty()
    for (location in locations) {
      // Handle location.
    }
  }

একটি অধিবেশন থেকে একটি রুট লিখুন

নিম্নলিখিত কোডটি প্রদর্শন করে যে কীভাবে একটি সেশন রেকর্ড করতে হয় যাতে একটি ব্যায়াম রুট রয়েছে:

suspend fun InsertExerciseRoute(healthConnectClient: HealthConnectClient) {
    val grantedPermissions =
        healthConnectClient.permissionController.getGrantedPermissions()
    if (!grantedPermissions.contains(
          getWritePermission(ExerciseSessionRecord::class))) {
        // The user doesn't allow the app to write exercise session data.
        return
    }

    val sessionStartTime = Instant.now()
    val sessionDuration = Duration.ofMinutes(20)
    val sessionEndTime = sessionStartTime.plus(sessionDuration)

    val exerciseRoute =
        if (grantedPermissions.contains(PERMISSION_WRITE_EXERCISE_ROUTE)) ExerciseRoute(
            listOf(
                ExerciseRoute.Location(
                    // Location times must be on or after the session start time
                    time = sessionStartTime,
                    latitude = 6.5483,
                    longitude = 0.5488,
                    horizontalAccuracy = Length.meters(2.0),
                    verticalAccuracy = Length.meters(2.0),
                    altitude = Length.meters(9.0),
                ), ExerciseRoute.Location(
                    // Location times must be before the session end time
                    time = sessionEndTime.minusSeconds(1),
                    latitude = 6.4578,
                    longitude = 0.6577,
                    horizontalAccuracy = Length.meters(2.0),
                    verticalAccuracy = Length.meters(2.0),
                    altitude = Length.meters(9.2),
                )
            )
        )
        else
        // The user doesn't allow the app to write exercise route data.
            null
    val exerciseSessionRecord = ExerciseSessionRecord(
        startTime = sessionStartTime,
        startZoneOffset = ZoneOffset.UTC,
        endTime = sessionEndTime,
        endZoneOffset = ZoneOffset.UTC,
        exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_BIKING,
        title = "Morning Bike Ride",
        exerciseRoute = exerciseRoute,
        metadata = Metadata.manualEntry(
            device = Device(type = Device.TYPE_PHONE)
        ),
    )
    val response = healthConnectClient.insertRecords(listOf(exerciseSessionRecord))
}