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-Suche. Anstatt Dienste wie das GPS des Geräts direkt zu aktivieren, gibt deine 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 dieser Lektion erfährst du, wie du mit dem Settings Client prüfen kannst, welche Einstellungen aktiviert sind, und wie du das Dialogfeld „Standorteinstellungen“ aufrufst, damit der Nutzer seine Einstellungen mit nur einmal Tippen aktualisieren kann.
Standortdienste konfigurieren
Wenn du die von den Google Play-Diensten und dem Anbieter für kombinierte Standortbestimmung bereitgestellten standortbezogenen Dienste verwenden möchtest, verbinde deine App über den Settings Client, prüfe dann die aktuellen Standorteinstellungen und fordere den Nutzer bei Bedarf auf, die erforderlichen Einstellungen zu aktivieren.
Apps, deren Funktionen standortbezogene Dienste verwenden, müssen je nach Anwendungsfall dieser Funktionen Berechtigungen zur Standortermittlung anfordern.
Standortabfrage einrichten
Wenn du Parameter für Anfragen an den Anbieter für kombinierte Standortbestimmung speichern möchtest, erstelle ein LocationRequest-Objekt.
Die Parameter bestimmen die Genauigkeit von Standortanfragen. Weitere Informationen zu allen verfügbaren Optionen für Standortabfragen finden Sie in der Klassenreferenz zu LocationRequest. In dieser Lektion werden das Aktualisierungsintervall, das schnellste Aktualisierungsintervall und die Priorität wie unten beschrieben festgelegt:
- Aktualisierungsintervall
-
setIntervalMillis(): Mit dieser Methode wird die Rate in Millisekunden festgelegt, mit der Ihre App Standort-Updates erhalten soll. Die Standortaktualisierungen können etwas schneller oder langsamer als diese Rate sein, um die Akkunutzung zu optimieren. Es kann auch sein, dass überhaupt keine Aktualisierungen erfolgen, 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 Standort-Updates verarbeiten kann. Wenn Ihre App nicht davon profitiert, dass sie Updates schneller als mit der insetInterval()angegebenen Rate erhält, müssen Sie 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 deutlichen Hinweis darauf, welche Standortquellen verwendet werden sollen. Folgende Werte werden unterstützt:-
PRIORITY_BALANCED_POWER_ACCURACY: Mit dieser Einstellung wird die Standortgenauigkeit auf einen Häuserblock genau angefordert, was einer Genauigkeit von etwa 100 Metern entspricht. Dies gilt als grobe Genauigkeit und verbraucht wahrscheinlich weniger Strom. Bei dieser Einstellung verwenden die Standortdienste wahrscheinlich die WLAN- und Mobilfunkmast-Positionierung. Die Wahl des Standortanbieters hängt jedoch von vielen anderen Faktoren ab, z. B. davon, welche Quellen verfügbar sind. -
PRIORITY_HIGH_ACCURACY: Mit dieser Einstellung wird der genaueste Standort angefordert. Bei dieser Einstellung verwenden die Standortdienste eher GPS, um den Standort zu bestimmen. PRIORITY_LOW_POWER: Mit dieser Einstellung wird eine Genauigkeit auf Stadtebene angefordert, was einer Genauigkeit von etwa 10 Kilometern entspricht. Dies gilt als grobe Genauigkeit und verbraucht wahrscheinlich weniger Strom.PRIORITY_PASSIVE: Verwende diese Einstellung, wenn du die Auswirkungen auf den Stromverbrauch vernachlässigen kannst, aber Standort-Updates erhalten möchtest, 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 im folgenden 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, kombiniert 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 kombinierte Standortbestimmung Standortaktualisierungen zurückgibt, die auf wenige Meter genau sind.
Dieser Ansatz eignet sich für Karten-Apps, die den Standort in Echtzeit anzeigen.
Leistungshinweis:Wenn deine App nach dem Erhalt eines Standort-Updates auf das Netzwerk zugreift oder andere langwierige Aufgaben ausführt, solltest du das schnellste Intervall auf einen langsameren Wert einstellen. Durch diese Anpassung wird verhindert, dass deine App Updates erhält, die sie nicht verwenden kann. Sobald die lang andauernde Aufgabe abgeschlossen ist, setze das schnellste Intervall wieder auf einen schnellen Wert.
Aktuelle Standorteinstellungen abrufen
Nachdem du eine Verbindung zu den Google Play-Diensten und der Location Services API hergestellt hast, kannst du die aktuellen Standorteinstellungen des Geräts eines Nutzers abrufen. Erstellen Sie dazu eine 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 anhand des Statuscodes aus dem LocationSettingsResponse-Objekt prüfen. 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
Wenn Sie feststellen möchten, ob die Standorteinstellungen für die Standortanfrage geeignet sind, fügen Sie dem
Task-Objekt, das die Standorteinstellungen validiert, einen
OnFailureListener hinzu. 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. Zeigen Sie dann ein Dialogfeld an, in dem der Nutzer aufgefordert wird, die Berechtigung zum Ändern der Standorteinstellungen zu erteilen. Rufen Sie dazu
startResolutionForResult() auf.
Das folgende Code-Snippet zeigt, wie Sie feststellen, ob die Standorteinstellungen des Nutzers es standortbezogenen Diensten erlauben, ein
LocationRequest-Objekt zu erstellen. Außerdem wird gezeigt, wie Sie den Nutzer bei Bedarf um Erlaubnis bitten, 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 anfordern, erfährst du, wie du regelmäßige Standortaktualisierungen erhältst.