Standortzugriff zur Laufzeit anfordern

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 die Anleitung zum Minimieren von Berechtigungsanfragen ansehen. Anhand dieser Ressourcen können Sie entscheiden, welche Berechtigung Sie anfordern sollten und ob der Button „Standort“ eine bessere Alternative für Ihren Anwendungsfall ist.

Richtlinien für den Zugriff auf Berechtigungen zur Standortermittlung

Hier sind einige allgemeine Regeln, die Sie bei der Entscheidung über die Implementierung des Standortzugriffs in Ihrer App beachten sollten.

Im Kontext auf den Standort zugreifen

Wenn für eine Funktion in Ihrer App der Standortzugriff erforderlich ist, 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 zum Anfordern von App-Berechtigungen beschrieben.

Abbildung 1 zeigt, wie dieser Vorgang ausgeführt wird. Die App enthält die Funktion „Standort teilen“, für die der Standortzugriff im Vordergrund erforderlich ist. Die App fordert die Berechtigung zur Standortermittlung jedoch erst an, wenn der Nutzer die Schaltfläche Standort teilen auswählt.

Nachdem der Nutzer den Button „Standort teilen“ ausgewählt hat, wird das Berechtigungsdialogfeld des Systems für den Standortzugriff angezeigt.
Abbildung 1: Funktion zum Teilen des Standorts, die Zugriff auf die Standortermittlung im Vordergrund erfordert. Die Funktion ist aktiviert, wenn der Nutzer Zugriff nur während der Nutzung der App zulassen 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 Standortdaten abrufen dürfen, selbst wenn Ihre App die Laufzeitberechtigung ACCESS_FINE_LOCATION anfordert.

Um dieses potenzielle Nutzerverhalten zu berücksichtigen, sollten Sie die Berechtigung ACCESS_FINE_LOCATION nicht einzeln anfordern. Fordern Sie stattdessen sowohl die Berechtigung ACCESS_FINE_LOCATION als auch die Berechtigung ACCESS_COARSE_LOCATION in einer einzigen Laufzeitanfrage an. Wenn Sie nur ACCESS_FINE_LOCATION anfordern, ignoriert das System die Anfrage in einigen Versionen von Android 12. 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: Ermöglicht Ihrer App, genaue Standortinformationen abzurufen.
  • Ungefähr: Ermöglicht Ihrer App, nur ungefähre Standortinformationen abzurufen.

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 der 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 dann, 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.

Das Dialogfeld bezieht sich nur auf den ungefähren Standort und enthält drei Schaltflächen übereinander.
Abbildung 2. Systemberechtigungsdialogfeld, das angezeigt wird, wenn Ihre App nur ACCESS_COARSE_LOCATION anfordert.
Der Dialog enthält zwei Gruppen von Optionen, die übereinander angeordnet sind.
Abbildung 3: Systemberechtigungsdialogfeld, das angezeigt wird, wenn Ihre App sowohl ACCESS_FINE_LOCATION als auch ACCESS_COARSE_LOCATION in einer einzelnen Laufzeitanfrage anfordert.

Nutzerauswahl wirkt sich auf die Erteilung von Berechtigungen aus

In der folgenden Tabelle sind die Berechtigungen aufgeführt, die das System Ihrer App gewährt, basierend auf den Optionen, die der Nutzer im Berechtigungsdialog zur Laufzeit 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 Berechtigungen zur Standortermittlung Keine Berechtigungen zur Standortermittlung

Um herauszufinden, welche Berechtigungen das System Ihrer App erteilt hat, prüfen Sie den Rückgabewert Ihrer Berechtigungsanfrage. Sie können Jetpack-Bibliotheken in Code verwenden, der dem folgenden ähnelt, oder Sie können Plattformbibliotheken verwenden, in 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 beantragen

Sie können den Nutzer bitten, den Zugriff Ihrer App vom ungefähren Standort auf den genauen Standort zu aktualisieren. Bevor Sie den Nutzer jedoch auffordern, den Zugriff Ihrer App auf den genauen Standort zu aktualisieren, sollten Sie prüfen, ob der Anwendungsfall Ihrer App diese Genauigkeit unbedingt erfordert. Wenn Ihre App ein Gerät über Bluetooth oder WLAN mit Geräten in der Nähe koppeln muss, sollten Sie stattdessen die Companion Device-Kopplung 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 aktualisieren:

  1. Erläutern Sie bei Bedarf, warum Ihre App die Berechtigung benötigt.
  2. Fordere die Berechtigungen ACCESS_FINE_LOCATION und ACCESS_COARSE_LOCATION noch einmal zusammen an. Da der Nutzer dem System bereits erlaubt hat, Ihrer App den ungefähren Standort zu gewähren, unterscheidet sich der Systemdialog dieses Mal, wie in Abbildung 4 und Abbildung 5 dargestellt:
Das Dialogfeld enthält die Optionen „Auf genauen Standort umstellen“, „Nur dieses Mal“ und „Ablehnen“.
Abbildung 4: Der Nutzer hat zuvor Ungefähr und Beim Verwenden der App im Dialogfeld aus Abbildung 3 ausgewählt.
Das Dialogfeld enthält die Optionen „Nur dieses Mal“ und „Ablehnen“.
Abbildung 5. Der Nutzer hat zuvor Ungefähr und Nur dieses Mal im Dialogfeld aus Abbildung 3 ausgewählt.

Anfangs nur Standort im Vordergrund anfordern

Auch wenn mehrere Funktionen in Ihrer App Zugriff auf den Standort erfordern, ist es wahrscheinlich, dass nur für einige von ihnen die Standortermittlung im Hintergrund erforderlich ist. Daher wird empfohlen, dass Ihre App inkrementelle Anfragen für Berechtigungen zur Standortermittlung ausführt und zuerst den Zugriff auf den Standort im Vordergrund und dann die Standortermittlung im Hintergrund anfordert. Durch schrittweise Anfragen erhalten Nutzer mehr Kontrolle und Transparenz, da sie besser nachvollziehen können, für welche Funktionen in Ihrer App die Standortermittlung im Hintergrund erforderlich ist.

Abbildung 6 zeigt ein Beispiel für eine App, die für die Verarbeitung inkrementeller Anfragen konzipiert ist. Sowohl die Funktion „Aktuellen Standort anzeigen“ als auch „Orte in der Nähe empfehlen“ erfordern den Standortzugriff im Vordergrund. Nur für die Funktion „Orte in der Nähe empfehlen“ ist jedoch der Zugriff auf die Standortermittlung im Hintergrund erforderlich.

Die Schaltfläche, mit der der Zugriff auf die Standortermittlung im Vordergrund aktiviert wird, befindet sich eine halbe Bildschirmhöhe von der Schaltfläche entfernt, mit der die Standortermittlung im Hintergrund aktiviert wird.
Abbildung 6: Für beide Funktionen ist Standortzugriff erforderlich, aber nur für die Funktion „Empfehlungen für Orte in der Nähe“ ist der Zugriff auf die Standortermittlung im Hintergrund erforderlich.

So führen Sie inkrementelle Anfragen aus:

  1. Zuerst sollte Ihre App Nutzer zu den Funktionen führen, die einen Vordergrundzugriff auf den Standort erfordern, 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 die Standortermittlung im Hintergrund erfordern, zu deaktivieren, bis Ihre App Zugriff auf die Standortermittlung im Vordergrund hat.

  2. Wenn der Nutzer später Funktionen verwendet, die Zugriff auf die Standortermittlung im Hintergrund erfordern, können Sie Zugriff auf die Standortermittlung im Hintergrund anfordern.

Zusätzliche Ressourcen

Weitere Informationen zu Standortberechtigungen in Android finden Sie in den folgenden Materialien:

Codelabs

Videos

Beispiele

  • Beispiel-App zur Veranschaulichung der Verwendung von Berechtigungen zur Standortermittlung.