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