Standortzugriff zur Laufzeit anfordern

Wenn eine Funktion in Ihrer App Zugriff auf den Standort benötigt, warten Sie, bis der Nutzer mit der Funktion interagiert, bevor Sie die Berechtigungsanfrage stellen. Dieser Workflow folgt der Best Practice, Laufzeitberechtigungen im Kontext anzufordern, wie im Leitfaden zum Anfordern von App-Berechtigungen beschrieben.

Abbildung 1 zeigt ein Beispiel für diesen Prozess. Die App enthält die Funktion „Standort teilen“, für die der Zugriff auf den Standort 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 zur Standortermittlung angezeigt.
Abbildung 1 Funktion zur Standortfreigabe, für die der Zugriff auf den Standort im Vordergrund erforderlich ist. 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 ACCESS_FINE_LOCATION Laufzeitberechtigung anfordert.

Um dieses potenzielle Nutzerverhalten zu berücksichtigen, fordern Sie die Berechtigung ACCESS_FINE_LOCATION nicht allein an. Fordern Sie stattdessen in einer einzigen Laufzeitanfrage sowohl die ACCESS_FINE_LOCATION Berechtigung als auch die ACCESS_COARSE_LOCATION Berechtigung 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 Systemberechtigungsdialogfeld die folgenden Optionen für den Nutzer:

  • Präzise: Ermöglicht Ihrer App, genaue Standortdaten abzurufen.
  • Annähernd: Ermöglicht Ihrer App, nur ungefähre Standortdaten abzurufen.

Abbildung 3 zeigt, dass das Dialogfeld für beide Optionen eine visuelle Hilfestellung enthält, um dem Nutzer die Auswahl zu erleichtern. Nachdem der Nutzer eine Standortgenauigkeit ausgewählt 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 in einer einzigen Laufzeitanfrage sowohl ACCESS_FINE_LOCATION als auch ACCESS_COARSE_LOCATION anfordert.

Die Nutzerauswahl wirkt sich auf die Berechtigungserteilung aus

In der folgenden Tabelle sind die Berechtigungen aufgeführt, die das System Ihrer App erteilt, 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 Berechtigungen zur Standortermittlung Keine Berechtigungen zur Standortermittlung

Um zu ermitteln, 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, 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 vom ungefähren auf den genauen Standort zu aktualisieren. Bevor Sie den Nutzer jedoch bitten, den Zugriff Ihrer App auf den genauen Standort zu aktualisieren, sollten Sie prüfen, ob diese Genauigkeit für den Anwendungsfall Ihrer App unbedingt erforderlich ist. Wenn Ihre App ein Gerät über Bluetooth oder WLAN mit Geräten in der Nähe koppeln muss, sollten Sie stattdessen die Verwendung von Begleitgeräte-Kopplung oder Bluetooth-Berechtigungen in Betracht ziehen, anstatt die ACCESS_FINE_LOCATION Berechtigung anzufordern.

So fordern Sie den Nutzer auf, den Standortzugriff Ihrer App von „annähernd“ auf „präzise“ zu aktualisieren:

  1. Erklären Sie gegebenenfalls, warum Ihre App die Berechtigung benötigt.
  2. Fordern Sie die Berechtigungen ACCESS_FINE_LOCATION und ACCESS_COARSE_LOCATION noch einmal gemeinsam an. Da der Nutzer dem System bereits erlaubt hat, Ihrer App den Zugriff auf den ungefähren Standort zu gewähren, unterscheidet sich das Systemdialogfeld 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 im Dialogfeld aus Abbildung 3 Annähernd und Bei Nutzung der App ausgewählt.
Das Dialogfeld enthält die Optionen „Nur dieses Mal“ und „Ablehnen“.
Abbildung 5 Der Nutzer hat zuvor Annähernd und Nur dieses Mal (im Dialogfeld aus Abbildung 3) ausgewählt.

Zuerst nur Zugriff auf den Standort im Vordergrund anfordern

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

Abbildung 6 zeigt ein Beispiel für eine App, die für die Verarbeitung schrittweiser Anfragen entwickelt wurde. Für die Funktionen „Aktuellen Standort anzeigen“ und „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.

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 der Zugriff auf den Standort erforderlich, aber nur für die Funktion „Orte in der Nähe empfehlen“ ist die Standortermittlung im Hintergrund erforderlich.

So führen Sie schrittweise Anfragen aus:

  1. 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 empfiehlt sich, den Nutzerzugriff auf Funktionen zu deaktivieren, für die die Standortermittlung im Hintergrund erforderlich ist, bis Ihre App Zugriff auf den Standort im Vordergrund hat.

  2. Später, wenn der Nutzer 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 unter Android finden Sie in den folgenden Materialien:

Codelabs

Videos

Beispiele

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