2016-04-20 4 views
3

Das ist meine GPSTracker Konstruktor Klasse:getLastKnownLocation Rückkehr NULL mit GPS_PROVIDER und NETWORK_PROVIDER

public GPSTracker(Context context) { 
    this.mContext = context; 
    locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 

    Location gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    Location networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
} 

gpsLocation und networkLocation ist immer NULL.

getLastKnowLocation-Methode gibt mir keinen Standort zurück ... auch wenn ich sicher bin, dass wenige Sekunden vor dem Mittagessen Aktivität (und Erstellen von GPSTracker-Objekt) das Gerät Netzwerkstandort hatte (Ich habe Geotagging deaktiviert nach der Überprüfung, dass ein Netzwerk Standort verfügbar war)

auf Nexus getestet 5 mit Android Studio

+0

Was ist die Frage? –

Antwort

1

Yep, getLastKnownLocation() kann auch null zurück. Die documentation sagt:

einen Standort Gibt die Daten von der letzten bekannten Position angibt fix aus dem angegebenen Anbieter erhalten.

Dies kann ohne Starten des Anbieters erfolgen. Beachten Sie, dass dieser Standort möglicherweise veraltet ist, z. B. wenn das Gerät ausgeschaltet und an einen anderen Ort verschoben wurde.

Wenn der Anbieter derzeit deaktiviert ist, wird null zurückgegeben.

Ein Android-Gerät verfolgt seinen Standort nicht automatisch ständig. Der "letzte bekannte Standort" ist nur verfügbar, wenn eine Anwendung den Standort angefordert hat. Sie sollten also nicht erwarten, immer einen Standort mit getLastKnownLocation() zu bekommen. Und selbst wenn etwas zurückgegeben wird, ist der Standort möglicherweise nicht auf dem neuesten Stand. Das Objekt Location hat einen Zeitstempel, den Sie mit der Methode getTime() lesen können, und eine geschätzte Genauigkeit, die Sie mit der Methode getAccuracy() lesen können. Diese können verwendet werden, um zu bewerten, ob der Ort verwendbar ist.

Wenn Sie null oder einen sehr alten Standort erhalten, müssen Sie einen neuen Speicherort anfordern. Die grundlegenden Optionen erfordern nur eine Aktualisierung des einzelnen Standorts oder kontinuierliche Aktualisierungen mit einem Zeitintervall, das Sie angeben können.

In jedem Fall Ihre Klasse die LocationListener Schnittstelle implementieren muss:

public class GpsTracker implements LocationListener { 

    // ...other code goes here... 

    @Override 
    public void onLocationChanged(Location location) { 

     // Do something with 'location' here. 

    } 
} 

Für einen einzelnen Standort aktualisieren Sie nennen würde [LocationManager.requestSingleUpdate()] (http://developer.android.com/reference/android/location/LocationManager.html#requestSingleUpdate(java.lang.String, android.location.LocationListener, android.os .Looper)) und für kontinuierliche Aktualisierungen [LocationManager.requestLocationUpdates()] (http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(java.lang.String, long, float, android.location.LocationListener)). In jedem Fall wird es eine kleine (oder nicht so kleine) Verzögerung geben und der LocationListener.onLocationChanged() Rückruf wird aufgerufen, wenn ein Standort verfügbar ist.

Zum Beispiel könnten Sie ein einzelnes Update vom GPS-Provider wie folgt anfordern:

locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, null); 

Für die kontinuierliche Updates vom GPS-Provider max.alle 1 Sekunde und nur dann, wenn der Ort hat mindestens 1 Meter geändert könnte man nennen:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this); 

Und dann gibt es einige weitere Variationen der requestSingleUpdate(), die Sie in der Dokumentation und auf der anderen Seite der Google Play sehen Services Location APIs, aber lass uns nicht dorthin gehen. Ihre Frage lautete getLastKnownLocation(), die null zurückgibt, und Stack Overflow verfügt über mehrere Beispiele für verschiedene Möglichkeiten zum Anfordern eines aktuellen Standorts.

Verwandte Themen