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