Egzersiz rotası ekleme

Egzersiz rotaları, kullanıcıların ilişkili egzersiz aktiviteleri için GPS rotasını izlemelerine ve antrenmanlarının haritalarını diğer uygulamalarla paylaşmalarına olanak tanır.

Bu kılavuzda, uygulamaların bir egzersiz oturumunun parçası olarak nasıl rota verileri yazma izni aldığı açıklanmaktadır.

Egzersiz rotalarındaki okuma ve yazma işlevlerinin kısa bir özetini burada bulabilirsiniz:

  1. Uygulamalar, egzersiz rotaları için yeni bir yazma izni oluşturur.
  2. Ekleme işlemi, alanında rota içeren bir egzersiz oturumu yazılarak gerçekleştirilir.
  3. Okuma:
    1. Oturum sahibi için verilere, oturum okuması kullanılarak erişilir.
    2. Üçüncü taraf bir uygulamada, kullanıcının rotayı bir kez okumasına izin veren bir iletişim kutusu aracılığıyla.

İzinler

Egzersiz rotalarının kendi çalışma zamanı yazma izni vardır (android.permission.health.WRITE_EXERCISE_ROUTE).

Uygulamanıza egzersiz rotası özelliği eklemek için öncelikle belirli bir veri türü için yazma izinleri isteyin.

Android 14 izin isteği

Android 14 izin isteği

Android 13 izin isteği

Android 13 izin isteği

Her rota bir egzersiz oturumuyla (bir oturum = bir antrenman) ilişkilendirildiğinden, bir egzersiz izni de beyan etmeniz gerekir.

Egzersiz rotaları yazabilmek için beyan etmeniz gereken izin aşağıda verilmiştir:

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

Egzersiz rotalarını okumak için aşağıdaki izinleri istemeniz gerekir:

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

İzin istemek için uygulamanızı Health Connect'e ilk kez bağlarken PermissionController.createRequestPermissionResultContract() yöntemini kullanın. İsteyebileceğiniz çeşitli izinler:

  • Rota verileri dahil sağlık verilerini okuma: HealthPermission.getReadPermission(ExerciseSessionRecord::class)
  • Rota verileri de dahil olmak üzere sağlık verilerini yazma: HealthPermission.getWritePermission(ExerciseSessionRecord::class)
  • Egzersiz rotası verilerini yazma: HealthPermission.PERMISSION_WRITE_EXERCISE_ROUTE

Rota verilerini okuma ve yazma

Uygulamalar, alan olarak rota içeren bir oturum yazarak bir rota ekler.

Kullanıcının yazma izni yoksa ve rota ayarlanmamışsa rota güncellenmez.

Uygulamanızın rota yazma izni varsa ve bir oturumu, rota olmadan bir oturum nesnesini geçirerek güncellemeye çalışırsa mevcut rota silinir.

Uygulamanızın bir üçüncü taraf uygulaması tarafından sağlanan rota verilerini okuması gerektiğinde, kullanıcıdan okuma işlemine izin vermesini isteyen bir iletişim kutusu gösterilir.

Oturumdan rota isteme

Aşağıdaki adımları uygulayarak Health Connect'te bir oturumu okuyabilir ve bu oturumdan rota isteyebilirsiniz:

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

Bir oturumdan rota yazın

Aşağıdaki kod, egzersiz rotası içeren bir oturumun nasıl kaydedileceğini göstermektedir:

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