مسیرهای ورزشی را اضافه کنید

مسیرهای تمرین به کاربران امکان می دهد مسیر GPS را برای فعالیت های ورزشی مرتبط ردیابی کنند و نقشه های تمرینات خود را با سایر برنامه ها به اشتراک بگذارند.

این راهنما نحوه دریافت مجوز برای نوشتن داده‌های مسیر را به عنوان بخشی از یک جلسه تمرین به برنامه‌ها نشان می‌دهد.

در اینجا خلاصه‌ای از عملکرد خواندن و نوشتن برای مسیرهای تمرین آمده است:

  1. برنامه ها یک مجوز نوشتن جدید برای مسیرهای تمرین ایجاد می کنند.
  2. درج با نوشتن یک جلسه تمرین با یک مسیر به عنوان میدان آن اتفاق می افتد.
  3. خواندن:
    1. برای صاحب جلسه، داده ها با استفاده از خواندن جلسه قابل دسترسی است.
    2. از یک برنامه شخص ثالث، از طریق یک گفتگو که به کاربر اجازه می دهد یک بار خواندن یک مسیر را بدهد.

مجوزها

مسیرهای تمرین مجوز نوشتن زمان اجرا مخصوص به خود را دارند ( android.permission.health.WRITE_EXERCISE_ROUTE ).

برای افزودن قابلیت مسیر تمرین به برنامه خود، با درخواست مجوز نوشتن برای یک نوع داده خاص شروع کنید.

درخواست مجوز اندروید 14

درخواست مجوز اندروید 14

درخواست مجوز اندروید 13

درخواست مجوز اندروید 13

شما همچنین باید مجوز ورزش را اعلام کنید، زیرا هر مسیر با یک جلسه تمرین مرتبط است (یک جلسه = یک تمرین).

در اینجا مجوزی که باید اعلام کنید تا بتوانید مسیرهای تمرینی بنویسید آمده است:

<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

خواندن و نوشتن اطلاعات مسیر

برنامه ها با نوشتن یک جلسه با یک مسیر به عنوان فیلد، مسیری را وارد می کنند.

اگر کاربر مجوز نوشتن نداشته باشد و مسیر تنظیم نشده باشد، مسیر به‌روزرسانی نمی‌شود.

اگر برنامه شما دارای مجوز نوشتن مسیر باشد و سعی کند یک جلسه را با عبور از یک شی جلسه بدون مسیر به روز کند، مسیر موجود حذف می شود.

هر زمان که برنامه شما نیاز به خواندن داده های مسیر ارائه شده توسط یک برنامه شخص ثالث داشته باشد، یک گفتگو ظاهر می شود که از کاربر می خواهد اجازه عملیات خواندن را بدهد.

درخواست مسیر از یک جلسه

در اینجا نحوه خواندن یک جلسه در Health Connect و درخواست مسیر از آن جلسه آمده است:

suspend fun readExerciseSessionAndRoute() {
    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()

    // 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.parse("2023-01-01T10:00:00.00Z")
    val sessionDuration = Duration.ofMinutes(20)

    val exerciseRoute =
      if (getPermissions.contains(PERMISSION_EXERCISE_ROUTE_WRITE) {
        ExerciseRoute(
          listOf(
            ExerciseRoute.Location(
              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(
              time = sessionStartTime.plus(sessionDuration)
              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 = /* starting time in milliseconds */,
            startZoneOffset = ZoneOffset.UTC,
            endTime = sessionStartTime.plus(sessionDuration),
            endZoneOffset = ZoneOffset.UTC,
            exerciseType = ExerciseSessionRecord.EXERCISE_TYPE_BIKING,
            title = "Morning Bike Ride",
            exerciseRoute = exerciseRoute
        )

    healthConnectClient.insertRecords(listOf(exerciseSessionRecord))
}