Standorteinstellungen ändern

Wenn Ihre App den Standort anfordern oder Berechtigungsaktualisierungen erhalten muss, müssen auf dem Gerät die entsprechenden Systemeinstellungen aktiviert sein, z. B. GPS oder WLAN-Suche. Anstatt Dienste wie das GPS des Geräts direkt zu aktivieren, gibt deine App die erforderliche Genauigkeit/den erforderlichen Stromverbrauch und das gewünschte Aktualisierungsintervall an. Das Gerät nimmt dann automatisch die entsprechenden Änderungen an den Systemeinstellungen vor. Diese Einstellungen werden durch das Datenobjekt LocationRequest definiert.

In dieser Lektion erfährst du, wie du mit dem Settings Client prüfen kannst, welche Einstellungen aktiviert sind, und wie du das Dialogfeld „Standorteinstellungen“ aufrufst, damit der Nutzer seine Einstellungen mit nur einmal Tippen aktualisieren kann.

Standortdienste konfigurieren

Wenn du die von den Google Play-Diensten und dem Anbieter für kombinierte Standortbestimmung bereitgestellten standortbezogenen Dienste verwenden möchtest, verbinde deine App über den Settings Client, prüfe dann die aktuellen Standorteinstellungen und fordere den Nutzer bei Bedarf auf, die erforderlichen Einstellungen zu aktivieren.

Apps, deren Funktionen standortbezogene Dienste verwenden, müssen je nach Anwendungsfall dieser Funktionen Berechtigungen zur Standortermittlung anfordern.

Standortabfrage einrichten

Wenn du Parameter für Anfragen an den Anbieter für kombinierte Standortbestimmung speichern möchtest, erstelle ein LocationRequest-Objekt. Die Parameter bestimmen die Genauigkeit von Standortanfragen. Weitere Informationen zu allen verfügbaren Optionen für Standortabfragen finden Sie in der Klassenreferenz zu LocationRequest. In dieser Lektion werden das Aktualisierungsintervall, das schnellste Aktualisierungsintervall und die Priorität wie unten beschrieben festgelegt:

Aktualisierungsintervall
setIntervalMillis(): Mit dieser Methode wird die Rate in Millisekunden festgelegt, mit der Ihre App Standort-Updates erhalten soll. Die Standortaktualisierungen können etwas schneller oder langsamer als diese Rate sein, um die Akkunutzung zu optimieren. Es kann auch sein, dass überhaupt keine Aktualisierungen erfolgen, z. B. wenn das Gerät keine Verbindung hat.
Schnellstes Aktualisierungsintervall
setMinUpdateIntervalMillis() – Mit dieser Methode wird die schnellste Rate in Millisekunden festgelegt, mit der Ihre App Standort-Updates verarbeiten kann. Wenn Ihre App nicht davon profitiert, dass sie Updates schneller als mit der in setInterval() angegebenen Rate erhält, müssen Sie diese Methode nicht aufrufen.
Priorität

setPriority() – Mit dieser Methode wird die Priorität der Anfrage festgelegt. Dadurch erhalten die Standortdienste der Google Play-Dienste einen deutlichen Hinweis darauf, welche Standortquellen verwendet werden sollen. Folgende Werte werden unterstützt:

  • PRIORITY_BALANCED_POWER_ACCURACY: Mit dieser Einstellung wird die Standortgenauigkeit auf einen Häuserblock genau angefordert, was einer Genauigkeit von etwa 100 Metern entspricht. Dies gilt als grobe Genauigkeit und verbraucht wahrscheinlich weniger Strom. Bei dieser Einstellung verwenden die Standortdienste wahrscheinlich die WLAN- und Mobilfunkmast-Positionierung. Die Wahl des Standortanbieters hängt jedoch von vielen anderen Faktoren ab, z. B. davon, welche Quellen verfügbar sind.
  • PRIORITY_HIGH_ACCURACY: Mit dieser Einstellung wird der genaueste Standort angefordert. Bei dieser Einstellung verwenden die Standortdienste eher GPS, um den Standort zu bestimmen.
  • PRIORITY_LOW_POWER: Mit dieser Einstellung wird eine Genauigkeit auf Stadtebene angefordert, was einer Genauigkeit von etwa 10 Kilometern entspricht. Dies gilt als grobe Genauigkeit und verbraucht wahrscheinlich weniger Strom.
  • PRIORITY_PASSIVE: Verwende diese Einstellung, wenn du die Auswirkungen auf den Stromverbrauch vernachlässigen kannst, aber Standort-Updates erhalten möchtest, sobald sie verfügbar sind. Mit dieser Einstellung löst Ihre App keine Standortaktualisierungen aus, empfängt aber Standorte, die von anderen Apps ausgelöst werden.

Erstellen Sie die Standortanfrage und legen Sie die Parameter wie im folgenden Codebeispiel fest:

Kotlin

  fun createLocationRequest() {
    val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
        .setMinUpdateIntervalMillis(5000)
        .build()
}

Java

  protected void createLocationRequest() {
    LocationRequest locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
            .setMinUpdateIntervalMillis(5000)
            .build();
}

Die Priorität von PRIORITY_HIGH_ACCURACY, kombiniert mit der Berechtigungseinstellung ACCESS_FINE_LOCATION, die Sie im App-Manifest definiert haben, und einem schnellen Aktualisierungsintervall von 5.000 Millisekunden (5 Sekunden) führt dazu, dass der Anbieter für kombinierte Standortbestimmung Standortaktualisierungen zurückgibt, die auf wenige Meter genau sind. Dieser Ansatz eignet sich für Karten-Apps, die den Standort in Echtzeit anzeigen.

Leistungshinweis:Wenn deine App nach dem Erhalt eines Standort-Updates auf das Netzwerk zugreift oder andere langwierige Aufgaben ausführt, solltest du das schnellste Intervall auf einen langsameren Wert einstellen. Durch diese Anpassung wird verhindert, dass deine App Updates erhält, die sie nicht verwenden kann. Sobald die lang andauernde Aufgabe abgeschlossen ist, setze das schnellste Intervall wieder auf einen schnellen Wert.

Aktuelle Standorteinstellungen abrufen

Nachdem du eine Verbindung zu den Google Play-Diensten und der Location Services API hergestellt hast, kannst du die aktuellen Standorteinstellungen des Geräts eines Nutzers abrufen. Erstellen Sie dazu eine LocationSettingsRequest.Builder und fügen Sie eine oder mehrere Standortanfragen hinzu. Das folgende Code-Snippet zeigt, wie die im vorherigen Schritt erstellte Standortanfrage hinzugefügt wird:

Kotlin

val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest)

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
     .addLocationRequest(locationRequest);

Prüfen Sie als Nächstes, ob die aktuellen Standorteinstellungen erfüllt sind:

Kotlin

val builder = LocationSettingsRequest.Builder()

// ...

val client: SettingsClient = LocationServices.getSettingsClient(this)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();

// ...

SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());

Wenn die Task abgeschlossen ist, kann Ihre App die Standorteinstellungen anhand des Statuscodes aus dem LocationSettingsResponse-Objekt prüfen. Wenn Sie noch mehr Details zum aktuellen Status der relevanten Standorteinstellungen erhalten möchten, kann Ihre App die Methode getLocationSettingsStates() des Objekts LocationSettingsResponse aufrufen.

Nutzer auffordern, die Standorteinstellungen zu ändern

Wenn Sie feststellen möchten, ob die Standorteinstellungen für die Standortanfrage geeignet sind, fügen Sie dem Task-Objekt, das die Standorteinstellungen validiert, einen OnFailureListener hinzu. Prüfen Sie dann, ob das an die Methode onFailure() übergebene Objekt Exception eine Instanz der Klasse ResolvableApiException ist. Das bedeutet, dass die Einstellungen geändert werden müssen. Zeigen Sie dann ein Dialogfeld an, in dem der Nutzer aufgefordert wird, die Berechtigung zum Ändern der Standorteinstellungen zu erteilen. Rufen Sie dazu startResolutionForResult() auf.

Das folgende Code-Snippet zeigt, wie Sie feststellen, ob die Standorteinstellungen des Nutzers es standortbezogenen Diensten erlauben, ein LocationRequest-Objekt zu erstellen. Außerdem wird gezeigt, wie Sie den Nutzer bei Bedarf um Erlaubnis bitten, die Standorteinstellungen zu ändern:

Kotlin

task.addOnSuccessListener { locationSettingsResponse ->
    // All location settings are satisfied. The client can initialize
    // location requests here.
    // ...
}

task.addOnFailureListener { exception ->
    if (exception is ResolvableApiException){
        // Location settings are not satisfied, but this can be fixed
        // by showing the user a dialog.
        try {
            // Show the dialog by calling startResolutionForResult(),
            // and check the result in onActivityResult().
            exception.startResolutionForResult(this@MainActivity,
                    REQUEST_CHECK_SETTINGS)
        } catch (sendEx: IntentSender.SendIntentException) {
            // Ignore the error.
        }
    }
}

Java

task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
    @Override
    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
        // All location settings are satisfied. The client can initialize
        // location requests here.
        // ...
    }
});

task.addOnFailureListener(this, new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        if (e instanceof ResolvableApiException) {
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                ResolvableApiException resolvable = (ResolvableApiException) e;
                resolvable.startResolutionForResult(MainActivity.this,
                        REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException sendEx) {
                // Ignore the error.
            }
        }
    }
});

In der nächsten Lektion, Standortaktualisierungen anfordern, erfährst du, wie du regelmäßige Standortaktualisierungen erhältst.