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 GPS des Geräts direkt zu aktivieren, gibt deine App die erforderliche Genauigkeit/den Stromverbrauch und das gewünschte Aktualisierungsintervall an und das Gerät nimmt 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 Einstellungs-Client prüfen, welche Einstellungen aktiviert sind, und dem Nutzer das Dialogfeld „Standorteinstellungen“ einblenden, in dem er seine Einstellungen mit einem einzigen Tippen aktualisieren kann.

Ortungsdienste konfigurieren

Damit Sie die von den Google Play-Diensten und dem Anbieter für kombinierten Standortbestimmung bereitgestellten Standortdienste nutzen können, müssen Sie Ihre App über den Einstellungs-Client verbinden. Prüfen Sie dann die aktuellen Standorteinstellungen und fordern Sie den Nutzer gegebenenfalls auf, die erforderlichen Einstellungen zu aktivieren.

Apps, deren Funktionen Standortdienste verwenden, müssen je nach den Anwendungsfällen für diese Funktionen Berechtigungen zur Standortermittlung anfordern.

Standortanfrage einrichten

Erstellen Sie einen LocationRequest, um Parameter für Anfragen an den Anbieter für kombinierte Standortbestimmung zu speichern. Die Parameter bestimmen die Genauigkeit von Standortanfragen. Ausführliche Informationen zu allen verfügbaren Optionen für Standortanfragen finden Sie in der LocationRequest-Klassenreferenz. In dieser Lektion werden das Aktualisierungsintervall, das schnellste Aktualisierungsintervall 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. Beachte, dass die Standortaktualisierungen etwas schneller oder langsamer sein können, um den Akku zu schonen, oder es werden überhaupt keine Aktualisierungen angezeigt (z. B. wenn das Gerät keine Verbindung hat).
Schnellstes Update-Intervall
setFastestInterval(): Diese Methode legt die schnellste Geschwindigkeit in Millisekunden fest, mit der deine App Standortaktualisierungen verarbeiten kann. Du musst diese Methode nur aufrufen, wenn deine Anwendung schneller als der in setInterval() angegebene Preis von Updates profitiert.
Priorität

setPriority(): Diese Methode legt die Priorität der Anfrage fest. Dadurch erhalten die Standortdienste der Google Play-Dienste einen starken Hinweis darauf, welche Standortquellen zu verwenden sind. Folgende Werte werden unterstützt:

  • PRIORITY_BALANCED_POWER_ACCURACY: Verwenden Sie diese Einstellung, um die Standortgenauigkeit innerhalb eines Häuserblocks anzufordern. Die Genauigkeit beträgt ungefähr 100 Meter. Dies gilt als grobe Genauigkeit und verbraucht wahrscheinlich weniger Strom. Bei dieser Einstellung verwenden die Standortdienste wahrscheinlich die Standortbestimmung über WLAN und Mobilfunkmasten. Die Wahl des Standortanbieters hängt jedoch von vielen anderen Faktoren ab, z. B. von den verfügbaren Quellen.
  • PRIORITY_HIGH_ACCURACY – Mit dieser Einstellung wird der genaueste Standort angefordert. Bei dieser Einstellung ist die Wahrscheinlichkeit höher, dass die Standortdienste zur Standortbestimmung GPS verwenden.
  • PRIORITY_LOW_POWER: Verwenden Sie diese Einstellung, um eine Genauigkeit auf Stadtebene anzufordern, die 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 der Stromverbrauch nur geringfügig beeinträchtigt werden muss, Sie aber Standortaktualisierungen erhalten möchten, sobald diese verfügbar sind. Bei dieser Einstellung löst Ihre App keine Standortaktualisierungen aus, erhält jedoch Standorte, die von anderen Apps ausgelöst werden.

Erstellen Sie die Standortanfrage und legen Sie die Parameter wie in diesem Codebeispiel 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 führt zusammen mit der Berechtigungseinstellung ACCESS_FINE_LOCATION, die Sie im App-Manifest festgelegt haben, und einem schnellen Aktualisierungsintervall von 5.000 Millisekunden (5 Sekunden) dazu, dass der Anbieter für kombinierte Standortaktualisierungen Standortaktualisierungen zurückgibt, die bis auf wenige Meter genau sind. Dieser Ansatz eignet sich für die Kartierung von Anwendungen, die den Standort in Echtzeit anzeigen.

Tipp zur Leistung:Wenn Ihre App auf das Netzwerk zugreift oder andere lang andauernde Aktionen ausführt, nachdem sie ein Standortupdate erhalten haben, sollten Sie für das schnellste Intervall einen niedrigeren Wert festlegen. Durch diese Anpassung erhält deine App keine Updates, die nicht verwendet werden können. Nach Abschluss der lang andauernden Arbeit setzen Sie das schnellste Intervall wieder auf einen schnellen Wert zurück.

Aktuelle Standorteinstellungen abrufen

Sobald Sie eine Verbindung zu den Google Play-Diensten und der Ortungsdienste API hergestellt haben, können Sie die aktuellen Standorteinstellungen des Geräts eines Nutzers abrufen. Dazu erstellst du ein LocationSettingsRequest.Builder-Objekt und fügst 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());

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

Nutzer auffordern, die Standorteinstellungen zu ändern

Wenn du feststellen möchtest, ob die Standorteinstellungen für die Standortanfrage geeignet sind, füge dem Task-Objekt ein OnFailureListener hinzu, um die Standorteinstellungen zu validieren. 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. Blende 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, ob Standortdienste über die Standorteinstellungen eines Nutzers ein LocationRequest erstellen dürfen. Außerdem wird der Nutzer um die Berechtigung gebeten, die Standorteinstellungen gegebenenfalls 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äßig Standortaktualisierungen erhalten.