2016-05-05 6 views
-2

Ich erstelle eine App, für die der aktuelle Standort zum Initialisieren und Anzeigen einer Karte erforderlich ist. Ich ersuche um Standortaktualisierungen mit LocationManager.requestLocationUpdates(...), aber dies scheint mir nur Daten zu geben, wenn sich der Standort ändert (z. B. ich bewege mich 10 Fuß). Ich versuche auch, getLastKnownLocation zu verwenden, aber in einigen seltenen Fällen (wie das Einschalten des GPS und ohne das Öffnen der App zu verschieben) gibt dies null für alle Anbieter zurück, die ich verwende.Abrufen des aktuellen Standorts jetzt, nicht beim Aktualisieren

Immer, wenn getLastKnownLocation null zurückgibt, kann meine App nicht initialisiert werden, bis ich mich um 10 Fuß bewege und eine Standortaktualisierung erhalte. Bis jetzt habe ich noch keine Methode gefunden, um nach meinem Standort zu fragen, noch habe ich etwas gefunden, das darauf hinweist, dass ich meine ersten Daten in dem Moment bekomme, in dem ich mich abmelde und nicht, wenn ich entweder den angegebenen Zeitraum abfahre oder den Umzug betreibe angegebene Entfernung.

Ein Ansatz wäre requestLocationUpdates(...) in einem sehr kleinen oder 0 Zeitintervall, erhalten, dass mir meine aktuelle Position zu senden, löschen Sie die LocationListener und wieder requestLocationUpdates(...) aber dieses Mal mit dem viel größeren Wert, den ich verwenden, um die Batterie zu vermeiden.

Ich bin auf der Suche nach einem besseren Weg, um das zu lösen. Wahrscheinlich etwas wie getCurrentLocation(), aber wirklich alles, was funktioniert.

+2

, um eine genaue Lesung zu erhalten jede Lösung wird beinhalten, auf einen Standort warten. Wenn der GPS-Provider keinen Standort finden kann, erhalten Sie null. In der FusedLocation-API haben Sie die Möglichkeit, die Anzahl der gewünschten Updates festzulegen, sodass Sie nur eine solche erhalten, wenn Sie nichts anderes benötigen. Sie müssen jedoch immer noch auf https://developers.google.com/android/reference/com/google/ warten. android/gms/location/LocationRequest.html # public-methods – tyczj

+1

"Wahrscheinlich so etwas wie getCurrentLocation()" - das gibt es nicht, weil es nicht garantiert ist, einen Ort zu bekommen. Neben dem Standardproblem von Benutzern, die Provider deaktivieren oder die Berechtigungen für Android 6.0+ blockieren, kann das Gerät aufgrund von Umgebungsfaktoren möglicherweise nicht in der Lage sein, einen Standort zu erhalten. Das Gerät kann sich beispielsweise in einer Tiefgarage befinden.Könnte es eine 'getCurrentLocation()' mit einem gewissen Timeout-Wert geben? Ja, aber das ist nicht besonders schwierig für Sie, sich selbst zu implementieren. – CommonsWare

Antwort

1

Ich wünsche Standortaktualisierungen mit LocationManager.requestLocationUpdates (...), aber dies scheint nur zu geben Sie mir Daten, wenn die Standortänderungen (zB I 10 Fuß bewegen).

Es wird Ihnen die erste Standortaktualisierung geben, sobald der Standort bestimmt ist - ob Sie sich bewegen oder nicht. Und es wäre keine schlechte Idee, für eine Weile mehr nach Updates zu suchen, da die ersten weniger genau sein könnten.

Ich bin auf der Suche nach einem besseren Weg, um dies zu lösen. Wahrscheinlich etwas wie getCurrentLocation(), aber wirklich alles, was funktioniert.

Wenn Sie keine kontinuierlichen Updates erhalten möchten, was ist dann mit einer der LocationManager.requestSingleUpdate() Varianten?

Diese geben Ihnen nur eine Standortaktualisierung im onLocationChanged() Rückruf (oder über eine Intent) und das war's. Keine Notwendigkeit, irgendwelche Listener usw. abzubrechen. Der Anruf könnte etwas wie sein:

+0

Anscheinend habe ich beide die Tatsache vermisst, dass requestLocationUpdates mir ein Update gibt, sobald der Standort bestimmt wird. Soweit ich es verstanden habe (und es getestet habe, obwohl ich es nicht sehr weit getestet habe), musste ich tatsächlich die Mindestentfernung verschieben oder das angegebene Zeitintervall warten, um die erste Aktualisierung zu erhalten. Vielen Dank für diese Klarstellungen. – Blueriver

1

Nun ich denke, Sie verwenden nur onLocationChanged-Methode, um Ihre Arbeit zu erledigen.

tun dies.

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    updateUi(); 
    }` 

public void updateUi() { 
     try { 
      mlastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
      if (mlastLocation != null) { 
       final double latitude = mlastLocation.getLatitude(); 
       final double longitude = mlastLocation.getLongitude(); 

       //using this cordinates you can initialize map 

       } 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } 
    }`