Bevor Sie zur Laufzeit den Zugriff auf den Standort anfordern, sollten Sie sich die Optionen und Best Practices für den Zugriff auf den Standort und den Leitfaden zum Minimieren von Berechtigungsanfragen ansehen. Diese Ressourcen helfen Ihnen bei der Entscheidung, welche Berechtigung Sie anfordern sollten und ob der Button „Standort“ eine bessere Alternative für Ihren Anwendungsfall ist.
Richtlinien für den Zugriff auf die Berechtigung zur Standortermittlung
Einige allgemeine Regeln, die Sie beachten sollten, wenn Sie entscheiden, wie Sie den Standortzugriff in Ihrer App implementieren möchten.
Standort im Kontext abrufen
Wenn eine Funktion in Ihrer App Zugriff auf den Standort erfordert, müssen Sie warten, bis der Nutzer mit der Funktion interagiert, bevor Sie die Berechtigungsanfrage stellen. Dies entspricht der Best Practice, Laufzeitberechtigungen im Kontext anzufordern, wie im Leitfaden App-Berechtigungen anfordern beschrieben.
In Abbildung 1 wird dieser Vorgang veranschaulicht. Die App enthält eine Funktion zum Teilen des Standorts, für die Zugriff auf die Standortermittlung im Vordergrund erforderlich ist. Die App fordert die Berechtigung zur Standortermittlung jedoch erst an, wenn der Nutzer den Button Standort teilen auswählt.
Nutzer gewährt nur Zugriff auf den ungefähren Standort
Ab Android 12 (API-Level 31) können Nutzer festlegen, dass Apps nur ungefähre Standortinformationen abrufen dürfen, selbst wenn Ihre App die Laufzeitberechtigung ACCESS_FINE_LOCATION anfordert.
Um dieses potenzielle Nutzerverhalten zu berücksichtigen, solltest du die Berechtigung ACCESS_FINE_LOCATION nicht allein anfordern. Fordern Sie stattdessen sowohl die Berechtigung ACCESS_FINE_LOCATION als auch die Berechtigung ACCESS_COARSE_LOCATION in einer einzigen Laufzeitanfrage an. Wenn Sie versuchen, nur ACCESS_FINE_LOCATION anzufordern, wird die Anfrage bei einigen Android 12-Releases ignoriert. Wenn Ihre App auf Android 12 oder höher ausgerichtet ist, protokolliert das System die folgende Fehlermeldung in Logcat:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
Wenn Ihre App sowohl ACCESS_FINE_LOCATION als auch ACCESS_COARSE_LOCATION anfordert, enthält das Dialogfeld für Systemberechtigungen die folgenden Optionen für den Nutzer:
- Genau: Die App kann genaue Standortinformationen abrufen.
- Ungefähr: Die App kann nur Informationen zum ungefähren Standort abrufen.
Abbildung 3 zeigt, dass das Dialogfeld für beide Optionen einen visuellen Hinweis enthält, um dem Nutzer die Auswahl zu erleichtern. Nachdem der Nutzer sich für eine Standortgenauigkeit entschieden hat, tippt er auf eine von drei Schaltflächen, um die Dauer der Berechtigungserteilung auszuwählen.
Unter Android 12 und höher können Nutzer in den Systemeinstellungen die bevorzugte Standortgenauigkeit für jede App festlegen, unabhängig von der Ziel-SDK-Version der App. Das gilt auch, wenn Ihre App auf einem Gerät mit Android 11 oder niedriger installiert ist und der Nutzer das Gerät dann auf Android 12 oder höher aktualisiert.
ACCESS_COARSE_LOCATION anfordert.ACCESS_FINE_LOCATION als auch ACCESS_COARSE_LOCATION in einer einzelnen Laufzeitanfrage anfordert.
Nutzerauswahl wirkt sich auf Berechtigungen aus
In der folgenden Tabelle sind die Berechtigungen aufgeführt, die das System deiner App gewährt, basierend auf den Optionen, die der Nutzer im Laufzeitdialogfeld für Berechtigungen auswählt:
| Präzise | Annähernd | |
|---|---|---|
| Bei Nutzung der App | ACCESS_FINE_LOCATION und ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
| Nur dieses Mal | ACCESS_FINE_LOCATION und ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
| Ablehnen | Keine Berechtigung zur Standortermittlung | Keine Berechtigung zur Standortermittlung |
Wenn du wissen möchtest, welche Berechtigungen das System deiner App gewährt hat, prüfe den Rückgabewert deiner Berechtigungsanfrage. Sie können Jetpack-Bibliotheken in Code verwenden, der dem folgenden ähnelt, oder Plattformbibliotheken, bei denen Sie den Code für die Berechtigungsanfrage selbst verwalten.
Kotlin
@RequiresApi(Build.VERSION_CODES.N) fun requestPermissions() { val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions: // https://developer.android.com/training/permissions/requesting#request-permission locationPermissionRequest.launch( arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) ) }
Java
private void requestPermissions() { ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = null; Boolean coarseLocationGranted = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); } if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }); }
Upgrade auf genauen Standort anfordern
Sie können den Nutzer bitten, den Zugriff Ihrer App von „Ungefährer Standort“ auf „Genauer Standort“ zu ändern. Bevor du den Nutzer jedoch bittest, den Zugriff deiner App auf den genauen Standort zu aktualisieren, solltest du überlegen, ob der Anwendungsfall deiner App diese Genauigkeit unbedingt erfordert. Wenn deine App ein Gerät über Bluetooth oder WLAN mit Geräten in der Nähe koppeln muss, solltest du die Kopplung von Companion-Geräten oder Bluetooth-Berechtigungen verwenden, anstatt die Berechtigung ACCESS_FINE_LOCATION anzufordern.
So fordern Sie den Nutzer auf, den Standortzugriff Ihrer App von „ungefähr“ auf „genau“ zu ändern:
- Erläutern Sie gegebenenfalls, warum Ihre App die Berechtigung benötigt.
- Fordern Sie die Berechtigungen
ACCESS_FINE_LOCATIONundACCESS_COARSE_LOCATIONnoch einmal zusammen an. Da der Nutzer dem System bereits erlaubt hat, Ihrer App den ungefähren Standort zu gewähren, sieht das Systemdialogfeld diesmal anders aus, wie in Abbildung 4 und Abbildung 5 dargestellt:
Anfänglich nur Standortzugriff im Vordergrund anfordern
Auch wenn mehrere Funktionen in deiner App Zugriff auf den Standort erfordern, ist es wahrscheinlich, dass nur einige davon Zugriff auf die Standortermittlung im Hintergrund benötigen. Daher wird empfohlen, dass Ihre App inkrementelle Anfragen für Berechtigungen zur Standortermittlung stellt, also zuerst den Zugriff auf die Standortermittlung im Vordergrund und dann den Zugriff auf die Standortermittlung im Hintergrund anfordert. Durch schrittweise Anfragen erhalten Nutzer mehr Kontrolle und Transparenz, da sie besser nachvollziehen können, welche Funktionen in Ihrer App Zugriff auf die Standortermittlung im Hintergrund benötigen.
Abbildung 6 zeigt ein Beispiel für eine Anwendung, die für die Verarbeitung inkrementeller Anfragen konzipiert ist. Sowohl für die Funktion „Aktuellen Standort anzeigen“ als auch für die Funktion „Orte in der Nähe empfehlen“ ist der Zugriff auf den Standort im Vordergrund erforderlich. Nur für die Funktion „Orte in der Nähe empfehlen“ ist jedoch der Zugriff auf die Standortermittlung im Hintergrund erforderlich.
So führen Sie inkrementelle Anfragen aus:
Zuerst sollte Ihre App Nutzer zu den Funktionen führen, für die der Zugriff auf den Standort im Vordergrund erforderlich ist, z. B. die Funktion „Standort teilen“ in Abbildung 1 oder die Funktion „Aktuellen Standort anzeigen“ in Abbildung 2.
Es wird empfohlen, den Nutzerzugriff auf Funktionen, die den Zugriff auf die Standortermittlung im Hintergrund erfordern, zu deaktivieren, bis Ihre App Zugriff auf die Standortermittlung im Vordergrund hat.
Wenn der Nutzer später Funktionen verwendet, für die der Zugriff auf die Standortermittlung im Hintergrund erforderlich ist, können Sie den Zugriff auf die Standortermittlung im Hintergrund anfordern.
Zusätzliche Ressourcen
Weitere Informationen zu Berechtigungen zur Standortermittlung in Android finden Sie in den folgenden Materialien:
Codelabs
Videos
Beispiele
- Beispiel-App, um die Verwendung von Berechtigungen zur Standortermittlung zu demonstrieren.