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 Ihre App die erforderliche Genauigkeit/Stromaufnahme 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 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, verbinden Sie Ihre App über den Einstellungen-Client. Prüfen Sie dann die aktuellen Standorteinstellungen und bitten Sie den Nutzer bei Bedarf, die erforderlichen Einstellungen zu aktivieren.

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

Standortabfrage einrichten

Wenn Sie Parameter für Anfragen an den Anbieter des zusammengeführten Standorts speichern möchten, erstellen Sie eine LocationRequest. 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 etwas schneller oder langsamer als diese Rate erfolgen, um die Akkunutzung zu optimieren. Es kann auch sein, dass keine Aktualisierungen erfolgen (z. B. wenn das Gerät keine Verbindung hat).
Schnellstes Aktualisierungsintervall
setFastestInterval() Mit dieser Methode wird die höchste Rate in Millisekunden festgelegt, mit der Ihre App Standortaktualisierungen verarbeiten kann. Sofern Ihre App nicht von schnelleren Updates als der in setInterval() angegebenen Rate profitiert, müssen Sie 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 WLAN und die Standortbestimmung über Mobilfunkmasten. Die Auswahl des Standortanbieters hängt jedoch von vielen anderen Faktoren ab, z. B. von den verfügbaren Quellen.
  • PRIORITY_HIGH_ACCURACY – Mit dieser Einstellung können Sie den genauesten Standort anfordern. Bei dieser Einstellung verwenden die Standortdienste mit höherer Wahrscheinlichkeit GPS, um den Standort zu ermitteln.
  • PRIORITY_LOW_POWER – Mit dieser Einstellung können Sie eine Genauigkeit auf Stadtebene anfordern, was einer Genauigkeit von etwa 10 Kilometern entspricht. 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, sobald sie 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. Dadurch wird verhindert, dass Ihre App Updates erhält, die sie nicht verwenden kann. Sobald die langlaufende Aufgabe abgeschlossen ist, setzen Sie das kürzeste Intervall wieder auf einen schnellen Wert zurück.

Aktuelle Standorteinstellungen abrufen

Sobald Sie eine Verbindung zu den Google Play-Diensten und der API für Standortdienste 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 Exception-Objekt, das an die Methode onFailure() übergeben wurde, eine Instanz der Klasse ResolvableApiException ist. Andernfalls müssen die Einstellungen geändert werden. 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 empfangen, erfahren Sie, wie Sie regelmäßige Standortaktualisierungen erhalten.