Bu kılavuz, Health Connect 1.1.0-alpha12 sürümüyle uyumludur.
Egzersiz rotaları, kullanıcıların ilişkili egzersiz etkinlikleri 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 egzersiz oturumu kapsamında rota verileri yazma izninin nasıl alındığı açıklanmaktadır.
Egzersiz rotaları için okuma ve yazma işlevinin kısa bir özetini aşağıda bulabilirsiniz:
- Uygulamalar, egzersiz rotaları için yeni bir yazma izni oluşturur.
- Ekleme, alanı bir rota olan bir egzersiz oturumu yazılarak yapılır.
- Okuma:
- Oturum sahibi için verilere oturum okuma işlemi kullanılarak erişilir.
- Üçüncü taraf uygulamasından, kullanıcının bir rotayı tek seferlik okuma izni vermesine olanak tanıyan bir iletişim kutusu aracılığıyla.
İzinler
Antrenman 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 belirli bir veri türü için yazma izinleri isteğinde bulunarak başlayın.
Android 14 izin isteği
Android 13 izin isteği
Her rota bir egzersiz oturumuyla ilişkilendirildiğinden (bir oturum = bir antrenman) egzersiz izni de belirtmeniz gerekir.
Egzersiz rotaları yazabilmek için belirtmeniz gereken izin:
<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. İsteyebilirsiniz bazı izinler şunlardır:
- Rota verileri dahil olmak üzere sağlık verilerini okuma:
HealthPermission.getReadPermission(ExerciseSessionRecord::class)
- Rota verileri 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 bir yol içeren bir oturum yazarak yol ekler.
Kullanıcının yazma izni yoksa ve rota ayarlanmamışsa rota güncellenmez.
Uygulamanızda rota yazma izni varsa ve rota içermeyen bir oturum nesnesi göndererek oturumu güncellemeye çalışırsa mevcut rota silinir.
Uygulamanızın üçü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 isteğinde bulunma
Health Connect'te bir oturumu okumak ve bu oturumdan rota isteğinde bulunmak için:
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.
}
}
Bir oturumdan rota yazma
Aşağıdaki kodda, egzersiz rotası içeren bir oturumun nasıl kaydedileceği gösterilmektedir:
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))
}