Egzersiz rotası ekleme

Egzersiz rotaları, kullanıcıların ilgili egzersiz için GPS rotasını izlemesine olanak tanır. ve antrenman haritalarını diğer uygulamalarla paylaşabiliyor.

Bu kılavuzda, bir egzersizdir.

Egzersiz rotaları için okuma ve yazma işlevinin kısa bir özetini aşağıda bulabilirsiniz:

  1. Uygulamalar, egzersiz rotaları için yeni bir yazma izni oluşturur.
  2. Ekleme, alan olarak rota içeren bir egzersiz seansı yazarak gerçekleşir.
  3. Okuma Materyali:
    1. Oturum sahibinin verilerine, oturum okuma işlevi kullanılarak erişilir.
    2. Bir üçüncü taraf uygulamasından, kullanıcının onay vermesine olanak tanıyan bir iletişim kutusu aracılığıyla bir defalık okunan rotadır.

İzinler

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

Uygulamanıza egzersiz rotası özelliği eklemek için yazma isteğinde bulunarak başlayın belirli bir veri türü için uygun izinleri içerir.

Android 14 izin isteği

Android 14 izin isteği

Android 13 izin isteği

Android 13 izin isteği

Ayrıca her rota ilişkilendirildiği için bir egzersiz izni de beyan etmeniz gerekir. ile (bir oturum = bir antrenman).

Egzersiz rotası yazabilmek için beyan etmeniz gereken izin şunlardır:

<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 şunu kullanın: Aşağıdaki durumlarda PermissionController.createRequestPermissionResultContract() yöntemini kullanın: önce uygulamanızı Health Connect'e bağlayın. Verebileceğiniz bazı izinler istekte bulunabilirsiniz:

  • Rota verileri de 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
ziyaret edin.

Rota verilerini okuma ve yazma

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

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

Uygulamanız rota yazma iznine sahipse ve bir oturumu rotasız bir oturum nesnesini geçerse 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 iletişim kutusu görünür.

Oturumdan rota isteme

Health Connect'te bir oturumu okumak ve o oturumdan rota istemek için aşağıdaki işlemleri uygulayın oturum:

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 yazma

Aşağıdaki kod, egzersiz rotası:

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