2016-10-12 1 views
0

Ich habe einige Code, der mehrmals pro Sekunde in meiner App läuft. Ich versuche, meinen Standort in jedem Zyklus zu bekommen. Ich bin mit dem folgenden:Android fusioniert Standort api keine konsistenten Updates mit Bildschirm aus

Location myLastPos = LocationServices.FusedLocationApi.getLastLocation(googleApiClient) 

Meine App läuft auch im Hintergrund eine PARTIAL_WAKE_LOCK verwenden. Mit dem Bildschirm scheint alles in Ordnung zu sein. Wenn ich den Bildschirm ausschalte, läuft meine App immer noch normal, aber ich erhalte keine Standortinformationen mehr. Es scheint, dass ich viel seltener Updates (oft Minuten zwischen Updates) bekomme. Ich überprüfe den Zeitstempel des Standorts mit:

myLastPos.getElapsedRealtimeNanos() 

Ich fand auch, dass selbst wenn der Bildschirm auf mir einige seltsamen Ergebnisse. Manchmal bekomme ich ein paar Millisekunden zwischen Updates, manchmal bekomme ich ein paar Sekunden. Das ist alles sehr beunruhigend. Kann jemand mir helfen, FusedLocationApi richtig zu benutzen oder schlagen Sie eine Alternative vor. Alles, was ich wirklich will, ist, die GPS direkt für lat/long ein paar Mal pro Sekunde abzufragen, ohne Google Bibliotheken in die Quere kommen.

+0

Die 'getLastLocation()' Methode ruft nur den letzten bekannten Ort ab, den das Gerät zufällig kennt. Das Gerät bestimmt seinen Standort nicht selbst, sondern nur, wenn eine Anwendung den Standort anfordert. Ihre App ist nun von anderen Anwendungen abhängig, die Standortaktualisierungen anfordern. Wenn Sie alle paar Sekunden ein Update benötigen, fordern Sie regelmäßige Standortaktualisierungen selbst an. [Die Dokumentationsabteilung] (http://stackoverflow.com/documentation/android/1837/location#t=201610120710565214353) enthält Codebeispiele. –

+0

@MarkusKauppinen du bist richtig. Die Dokumentation ist nicht sehr klar darüber und meine Annahme war, dass das Android OS das GPS im Hintergrund automatisch abfragen würde und getLastLocation() würde nur das _latest_ Ergebnis liefern. Wenn Sie die Frage mit Ihrem Kommentar beantworten, kann ich sie als beantwortet markieren. Vielen Dank! – Shahin

+0

Es scheint eine allgemeine Verwirrung zu sein. Irgendwie könnte die Dokumentation deutlicher machen, dass es sich um einen alten und ungültigen Ort handelt. Technisch ist es korrekt, da es wirklich der "letzte bekannte" Ort ist.Jedenfalls habe ich jetzt eine richtige Antwort hinzugefügt. Dies könnte ein Duplikat einer älteren Frage sein, aber ich habe nicht leicht einen guten Kandidaten gefunden. Die meisten von ihnen (mit akzeptierten Antworten) sind gerade dabei, einen 'Null'-Ort zu bekommen. –

Antwort

0

Die getLastLocation() Methode erhält nur den letzten bekannten Ort, den das Gerät zufällig kennt. Der "letzte bekannte Ort" bedeutet hier genau das: Er ist möglicherweise nicht auf dem neuesten Stand. Die Orte haben einen Zeitstempel, anhand dessen sich feststellen lässt, ob der Standort noch relevant ist.

Das Gerät ermittelt seinen Standort nicht allein, sondern nur, wenn eine Anwendung den Standort anfordert. Ihre App ist nun von anderen Anwendungen abhängig, die Standortaktualisierungen anfordern.

Wenn Sie alle paar Sekunden Updates benötigen, dann fordern Sie regelmäßige Standortaktualisierungen selbst an.

Android documentation empfiehlt die FusedLocationProvider, aber die LocationManager ist auch eine absolut gültige Option, wenn es aus irgendeinem Grund ist die Google Play-Dienste zu vermeiden.

Die Grundidee ist es, erste Anfrage Standort-Updates:

// Using LocationManager as an example. 
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
// Using GPS, requesting location updates as soon as available and even for 
// the smallest changes. Here 'this' refers to our LocationListener 
// implementation. 
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 

Die Updates werden dann von einem Hörer empfangen:

@Override 
    public void onLocationChanged(Location location) { 
     // We received a location update. 
     // Copy the value from the method parameter to our 
     // class member variable. 
     mLocation = location; 
    } 

Und wenn Sie nicht mehr die Updates benötigen, sollten Sie die Anfrage abbrechen :

mLocationManager.removeUpdates(this); 

Der Ansatz ist für die FusedLocationPr sehr ähnlich Eierstock.

Verwandte Themen