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 insetInterval()
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.