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-Scannen. Anstatt Dienste wie das GPS des Geräts direkt zu aktivieren, gibt deine App den erforderlichen Grad an Genauigkeit/Stromverbrauch sowie 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 erfahren Sie, wie Sie mit dem Einstellungen-Client prüfen, welche Einstellungen aktiviert sind, und das Dialogfeld „Standorteinstellungen“ anzeigen, damit Nutzer ihre Einstellungen mit nur einem Tippen aktualisieren können.

Standortdienste konfigurieren

Wenn Sie die von Google Play-Diensten und dem Anbieter für den fusionierten Standort bereitgestellten Standortdienste verwenden möchten, stellen Sie eine Verbindung zwischen Ihrer App und dem Einstellungen-Client her. Prüfen Sie dann die aktuellen Standorteinstellungen und bitten Sie den Nutzer gegebenenfalls, die erforderlichen Einstellungen zu aktivieren.

Für Apps, deren Funktionen Standortdienste verwenden, müssen je nach Anwendungsfall Berechtigungen zur Standortermittlung angefordert werden.

Standortabfrage einrichten

Zum Speichern von Parametern für Anfragen an den Anbieter für kombinierte Standortbestimmung müssen Sie eine LocationRequest erstellen. Die Parameter bestimmen die Genauigkeit von Standortanfragen. Weitere Informationen zu allen verfügbaren Optionen für Standortanfragen finden Sie in der Klassenreferenz für LocationRequest. In dieser Lektion werden das Aktualisierungsintervall, das schnellste Aktualisierungsintervall und die Priorität festgelegt, wie unten beschrieben:

Aktualisierungsintervall
setInterval() Mit dieser Methode wird die Rate in Millisekunden festgelegt, mit der Ihre App bevorzugt Standortaktualisierungen erhält. Die Standortaktualisierungen können im Sinne der Akkunutzung etwas schneller oder langsamer erfolgen, um die Akkunutzung zu optimieren. Es kann aber auch sein, dass gar keine Updates erfolgen (z. B. wenn das Gerät keine Verbindung hat).
Schnellstes Aktualisierungsintervall
setFastestInterval(): Mit dieser Methode wird die schnellste Geschwindigkeit in Millisekunden festgelegt, mit der deine App Standortaktualisierungen verarbeiten kann. Sofern deine App keine Updates schneller erhält, als in setInterval() angegeben ist, musst du diese Methode nicht aufrufen.
Priorität

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

  • PRIORITY_BALANCED_POWER_ACCURACY – Mit dieser Einstellung können Sie eine Standortgenauigkeit von etwa 100 Metern anfordern, was einem Häuserblock entspricht. Dies gilt als grobe Genauigkeit und führt wahrscheinlich zu einem geringeren Stromverbrauch. Bei dieser Einstellung verwenden die Standortdienste wahrscheinlich die Positionierung von Mobilfunkmasten und WLAN. Die Auswahl des Standortanbieters hängt jedoch von vielen anderen Faktoren ab, z. B. von den verfügbaren Quellen.
  • PRIORITY_HIGH_ACCURACY – Verwenden Sie diese Einstellung, um den genauen Standort anzufordern. Bei dieser Einstellung verwenden die Standortdienste mit höherer Wahrscheinlichkeit GPS, um den Standort zu ermitteln.
  • PRIORITY_LOW_POWER: Verwenden Sie diese Einstellung, um eine Genauigkeit auf Stadtebene anzufordern, die eine Genauigkeit von etwa 10 Kilometern hat. Dies gilt als grobe Genauigkeit und verbraucht wahrscheinlich weniger Strom.
  • PRIORITY_NO_POWER – Verwenden Sie diese Einstellung, wenn Sie eine vernachlässigbare Auswirkung auf den Energieverbrauch benötigen, aber Standortaktualisierungen erhalten möchten, wenn diese verfügbar sind. Bei 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 in diesem Codebeispiel gezeigt fest:

Kotlin

fun createLocationRequest() {
  val locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build()
}

Java

protected void createLocationRequest() {
  LocationRequest locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build();
}

Die Priorität von PRIORITY_HIGH_ACCURACY in Kombination 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 den fusionierten Standort Standortaktualisierungen mit einer Genauigkeit von wenigen Metern zurückgibt. Dieser Ansatz eignet sich für Karten-Apps, die den Standort in Echtzeit anzeigen.

Hinweis zur Leistung:Wenn Ihre App nach Erhalt einer Standortaktualisierung auf das Netzwerk zugreift oder andere langwierige Aufgaben ausführt, passen Sie das kürzeste Intervall auf einen langsameren Wert an. Durch diese Anpassung wird verhindert, dass deine App Updates erhält, die sie nicht verwenden kann. Wenn die lang andauernde Arbeit erledigt ist, setzen Sie das schnellste Intervall auf einen schnellen Wert zurück.

Aktuelle Standorteinstellungen abrufen

Nachdem Sie eine Verbindung zu den Google Play-Diensten und der Location Services API hergestellt haben, können Sie die aktuellen Standorteinstellungen des Geräts eines Nutzers abrufen. Erstellen Sie dazu ein 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 prüfen, indem sie den Statuscode des Objekts LocationSettingsResponse ansieht. 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

Um festzustellen, ob die Standorteinstellungen für die Standortanfrage geeignet sind, fügen Sie dem Task-Objekt ein OnFailureListener hinzu, das die Standorteinstellungen validiert. Prüfen Sie dann, ob das an die Methode onFailure() übergebene Objekt Exception eine Instanz der Klasse ResolvableApiException ist. Das zeigt an, dass die Einstellungen geändert werden müssen. Rufen Sie dann startResolutionForResult() auf, um ein Dialogfeld anzuzeigen, in dem der Nutzer um Erlaubnis gebeten wird, die Standorteinstellungen zu ändern.

Im folgenden Code-Snippet wird gezeigt, wie Sie feststellen, ob die Standorteinstellungen des Nutzers es Standortdiensten erlauben, eine LocationRequest zu erstellen, und wie Sie den Nutzer um Erlaubnis bitten, die Standorteinstellungen bei Bedarf 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 erhalten, erfahren Sie, wie Sie regelmäßige Standortaktualisierungen erhalten.