Standorteinstellungen ändern

Wenn Ihre App den Standort anfordern oder Berechtigungsupdates erhalten muss, müssen auf dem Gerät die entsprechenden Systemeinstellungen aktiviert sein, z. B. GPS oder WLAN-Scanning. Anstatt Dienste wie das GPS des Geräts direkt zu aktivieren, gibt Ihre 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 diesem Codelab erfahren Sie, wie Sie mit dem Settings Client prüfen, welche Einstellungen aktiviert sind, und das Dialogfeld „Standorteinstellungen“ präsentieren, damit der Nutzer seine Einstellungen mit einem einzigen Tippen aktualisieren kann.

Standortdienste konfigurieren

Wenn Sie die von Google Play-Diensten bereitgestellten Standortdienste und den kombinierten Standortanbieter verwenden möchten, verbinden Sie Ihre App über den Settings Client. Prüfen Sie dann die aktuellen Standorteinstellungen und fordern Sie den Nutzer bei Bedarf auf, die erforderlichen Einstellungen zu aktivieren.

Apps, deren Funktionen Standortdienste verwenden, müssen je nach Anwendungsfall der Funktionen Berechtigungen zur Standortermittlung anfordern.

Standortabfrage einrichten

Wenn Sie Parameter für Anfragen an den Fused Location Provider speichern möchten, erstellen Sie ein LocationRequest. Die Parameter bestimmen die Genauigkeit von Standortanfragen. Details zu allen verfügbaren Optionen für Standortanfragen finden Sie in der Klassenreferenz zu LocationRequest. In dieser Lektion werden das Aktualisierungsintervall, das schnellste Aktualisierungsintervall und die Priorität festgelegt, wie unten beschrieben:

Aktualisierungsintervall
setIntervalMillis() – Mit dieser Methode wird die Rate in Millisekunden festgelegt, mit der Ihre App Standortaktualisierungen empfangen möchte. Hinweis: Die Standortaktualisierungen können etwas schneller oder langsamer als diese Rate erfolgen, um den Akkuverbrauch zu optimieren. Es kann auch sein, dass es überhaupt keine Aktualisierungen gibt (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 Standortaktualisierungen verarbeiten kann. Sofern Ihre App nicht davon profitiert, Updates schneller als in setInterval() angegeben zu erhalten, müssen Sie diese Methode nicht aufrufen.
Priorität

setPriority() – Mit dieser Methode wird die Priorität der Anfrage festgelegt. Die Standortdienste von Google Play-Diensten erhalten dadurch einen Hinweis darauf, 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 verbraucht wahrscheinlich weniger Strom. Bei dieser Einstellung werden für die Ortungsdienste wahrscheinlich WLAN und Mobilfunkmasten verwendet. Die Wahl des Standorts hängt jedoch von vielen anderen Faktoren ab, z. B. davon, welche Quellen verfügbar sind.
  • PRIORITY_HIGH_ACCURACY – Mit dieser Einstellung können Sie den genauesten möglichen Standort anfordern. Bei dieser Einstellung wird der Standort eher über GPS ermittelt.
  • PRIORITY_LOW_POWER – Mit dieser Einstellung können Sie eine Genauigkeit auf Stadtebene anfordern, die einer Genauigkeit von etwa 10 Kilometern entspricht. Dies gilt als grobe Genauigkeit und verbraucht wahrscheinlich weniger Strom.
  • PRIORITY_PASSIVE – Verwenden Sie diese Einstellung, wenn der Stromverbrauch nur geringfügig beeinträchtigt werden soll, Sie aber Standortaktualisierungen erhalten möchten, 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 in diesem 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 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 Fused Location Provider Standortaktualisierungen zurückgibt, die auf wenige Meter genau sind. Dieser Ansatz eignet sich für Karten-Apps, die den Standort in Echtzeit anzeigen.

Hinweis zur Leistung:Wenn Ihre App nach dem Empfang eines Standortupdates auf das Netzwerk zugreift oder andere zeitaufwendige Aufgaben ausführt, passen Sie das schnellste Intervall an einen langsameren Wert an. Dadurch wird verhindert, dass Ihre App Updates erhält, die sie nicht verwenden kann. Sobald die lang andauernde Aufgabe abgeschlossen ist, stellen Sie das schnellste Intervall wieder auf einen schnellen Wert ein.

Aktuelle Standorteinstellungen abrufen

Nachdem Sie eine Verbindung zu 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 Task abgeschlossen ist, kann Ihre App die Standorteinstellungen anhand des Statuscodes des LocationSettingsResponse-Objekts prüfen. Wenn Sie noch mehr Details zum aktuellen Status der relevanten Standorteinstellungen erhalten möchten, kann Ihre App die Methode getLocationSettingsStates()LocationSettingsResponse des Objekts 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. Dies weist darauf hin, dass die Einstellungen geändert werden müssen. Blenden Sie dann ein Dialogfeld ein, in dem der Nutzer um die Berechtigung zum Ändern der Standorteinstellungen gebeten wird. Rufen Sie dazu startResolutionForResult() auf.

Das folgende Code-Snippet zeigt, wie Sie ermitteln, ob die Standorteinstellungen des Nutzers es Standortdiensten erlauben, ein LocationRequest zu erstellen, und wie Sie den Nutzer bei Bedarf um die Berechtigung zum Ändern der Standorteinstellungen bitten:

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, erfahren Sie, wie Sie regelmäßige Standortaktualisierungen erhalten.