Standorteinstellungen ändern

Wenn deine App den Standort anfordern oder Berechtigungsupdates erhalten muss, muss das Gerät die entsprechenden Systemeinstellungen aktivieren, z. B. GPS- oder WLAN-Suche. 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 Settings Client prüfen, welche Einstellungen aktiviert sind. Außerdem erfahren Sie, wie Nutzer das Dialogfeld „Standorteinstellungen“ mit einem einzigen Tippen aktualisieren können.

Standortdienste konfigurieren

Damit du die Standortdienste der Google Play-Dienste und des Anbieters für kombinierte Standortbestimmung verwenden kannst, musst du deine App über den Settings Client verbinden. Prüfe dann die aktuellen Standorteinstellungen und fordere den Nutzer gegebenenfalls auf, die erforderlichen Einstellungen zu aktivieren.

Apps, für die Standortdienste verwendet werden, müssen je nach Anwendungsfällen Berechtigungen zur Standortermittlung anfordern.

Standortanfrage einrichten

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

Aktualisierungsintervall
setInterval(): Mit dieser Methode wird die Häufigkeit in Millisekunden festgelegt, mit der deine App Standortaktualisierungen bevorzugt. Die Standortaktualisierungen können im Sinne der Akkunutzung etwas schneller oder langsamer erfolgen, um die Akkunutzung zu optimieren. Es kann aber auch sein, dass 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. Wenn 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. Dadurch erhalten die Standortdienste der Google Play-Dienste einen starken Hinweis darauf, welche Standortquellen verwendet werden sollen. Die folgenden Werte werden unterstützt:

  • PRIORITY_BALANCED_POWER_ACCURACY: Verwenden Sie diese Einstellung, um die Standortgenauigkeit innerhalb eines Häuserblocks anzufordern. Die Genauigkeit beträgt etwa 100 Meter. Dies gilt als grober Genauigkeitsgrad und verbraucht wahrscheinlich weniger Energie. 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 ist die Wahrscheinlichkeit höher, dass die Standortdienste GPS verwenden, um den Standort zu bestimmen.
  • PRIORITY_LOW_POWER: Verwenden Sie diese Einstellung, um eine Genauigkeit auf Stadtebene anzufordern, die eine Genauigkeit von etwa 10 Kilometern hat. Dies gilt als grober Genauigkeitsgrad und verbraucht wahrscheinlich weniger Energie.
  • PRIORITY_NO_POWER: Verwenden Sie diese Einstellung, wenn Sie nur geringfügige Auswirkungen auf den Stromverbrauch haben, aber Standortupdates erhalten möchten, sofern verfügbar. Bei dieser Einstellung löst Ihre App keine Standortaktualisierungen aus, empfängt aber von anderen Apps ausgelöste Standorte.

Erstellen Sie die Standortanfrage und legen Sie die Parameter fest, wie in diesem Codebeispiel gezeigt:

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, kombiniert mit der Berechtigungseinstellung ACCESS_FINE_LOCATION, die du im App-Manifest definiert hast, und einem Intervall für schnelle Updates von 5.000 Millisekunden (5 Sekunden), führt der Anbieter für kombinierte Standortbestimmung dazu, Standortaktualisierungen auf wenige Meter genau zurückzugeben. Dieser Ansatz eignet sich für die Kartierung von Apps, die den Standort in Echtzeit anzeigen.

Leistungshinweis:Wenn deine App nach dem Erhalt eines Standortupdates auf das Netzwerk zugreift oder andere Vorgänge mit langer Ausführungszeit ausführt, setze das schnellste Intervall auf einen langsameren Wert. 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 einen LocationSettingsRequest.Builder und fügen Sie eine oder mehrere Standortanfragen hinzu. Das folgende Code-Snippet zeigt, wie die Standortanfrage hinzugefügt wird, die im vorherigen Schritt erstellt wurde:

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());

Nach Abschluss von Task kann deine App die Standorteinstellungen anhand des Statuscodes des LocationSettingsResponse-Objekts prüfen. Um noch mehr Details zum aktuellen Status der entsprechenden Standorteinstellungen zu erhalten, kann die App die Methode getLocationSettingsStates() des LocationSettingsResponse-Objekts aufrufen.

Nutzer auffordern, die Standorteinstellungen zu ändern

Wenn Sie ermitteln möchten, ob die Standorteinstellungen für die Standortanfrage geeignet sind, fügen Sie dem Task-Objekt ein OnFailureListener-Objekt hinzu, mit dem die Standorteinstellungen validiert werden. 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. Blenden Sie dann ein Dialogfeld ein, in dem der Nutzer um die Berechtigung gebeten wird, die Standorteinstellungen durch Aufrufen von startResolutionForResult() zu ändern.

Im folgenden Code-Snippet sehen Sie, wie Sie feststellen können, ob die Standortdienste des Nutzers die Erstellung eines LocationRequest zulassen. Außerdem wird gezeigt, wie Sie den Nutzer bei Bedarf um die Berechtigung bitten können, 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 erhalten, erfahren Sie, wie Sie regelmäßige Standortaktualisierungen erhalten.