Dieser Leitfaden ist mit der Health Connect-Version 1.1.0-alpha12 kompatibel.
Mit Trainingsrouten können Nutzer eine GPS-Route für zugehörige Trainingsaktivitäten aufzeichnen und Karten ihrer Trainings mit anderen Apps teilen.
In diesem Leitfaden wird beschrieben, wie Apps die Berechtigung zum Schreiben von Routendaten im Rahmen einer Trainingseinheit erhalten.
Hier eine kurze Zusammenfassung der Lese- und Schreibfunktionen für Trainingsrouten:
- Apps erstellen eine neue Schreibberechtigung für Trainingsrouten.
- Dazu wird eine Trainingseinheit mit einer Route als Feld geschrieben.
- Lesen:
- Für den Inhaber der Sitzung wird auf Daten über eine Sitzungsleseoperation zugegriffen.
- Über eine Drittanbieter-App über ein Dialogfeld, über das der Nutzer die einmalige Lesezugriffsrechte für eine Route gewähren kann.
Berechtigungen
Trainingspfade haben eine eigene Laufzeitschreibberechtigung (android.permission.health.WRITE_EXERCISE_ROUTE
).
Wenn Sie Ihrer App die Funktion „Trainingsroute“ hinzufügen möchten, müssen Sie zuerst Schreibberechtigungen für einen bestimmten Datentyp anfordern.
Berechtigungsanfrage für Android 14
Berechtigungsanfrage für Android 13
Sie müssen auch eine Berechtigung für Übungen deklarieren, da jeder Route eine Trainingseinheit zugeordnet ist (eine Sitzung = ein Training).
Sie müssen die folgende Berechtigung erklären, um Trainingsrouten erstellen zu können:
<application>
<uses-permission
android:name="android.permission.health.WRITE_EXERCISE_ROUTE" />
<uses-permission
android:name="android.permission.health.WRITE_EXERCISE" />
...
</application>
Wenn Sie Trainingsrouten lesen möchten, müssen Sie die folgenden Berechtigungen anfordern:
<application>
<uses-permission
android:name="android.permission.health.READ_EXERCISE_ROUTES" />
<uses-permission
android:name="android.permission.health.READ_EXERCISE" />
...
</application>
Wenn Sie Berechtigungen anfordern möchten, verwenden Sie die Methode PermissionController.createRequestPermissionResultContract()
, wenn Sie Ihre App zum ersten Mal mit Health Connect verbinden. Beispiele für Berechtigungen, die Sie anfordern können:
- Gesundheitsdaten, einschließlich Routendaten, lesen:
HealthPermission.getReadPermission(ExerciseSessionRecord::class)
- Gesundheitsdaten, einschließlich Routendaten, schreiben:
HealthPermission.getWritePermission(ExerciseSessionRecord::class)
- Daten zur Trainingsroute schreiben:
HealthPermission.PERMISSION_WRITE_EXERCISE_ROUTE
Routendaten lesen und schreiben
Apps fügen eine Route ein, indem sie eine Sitzung mit einer Route als Feld schreiben.
Wenn der Nutzer keine Schreibberechtigungen hat und die Route nicht festgelegt ist, wird sie nicht aktualisiert.
Wenn Ihre App die Berechtigung zum Schreiben von Routen hat und versucht, eine Sitzung zu aktualisieren, indem sie ein Sitzungsobjekt ohne Route übergibt, wird die vorhandene Route gelöscht.
Wenn Ihre App Routendaten von einer Drittanbieter-App lesen muss, wird ein Dialogfeld angezeigt, in dem der Nutzer aufgefordert wird, den Lesevorgang zuzulassen.
Route von einer Sitzung anfordern
So lesen Sie eine Sitzung in Health Connect und fordern eine Route von dieser Sitzung an:
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.
}
}
Route aus einer Sitzung schreiben
Im folgenden Code wird gezeigt, wie eine Trainingseinheit mit einem Trainingsweg aufgezeichnet wird:
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))
}