Android Locationmanager Requestlocationupdates Doesn't Work
Solution 1:
The primary reason why you aren't getting updated location information quickly is that you're relying on the NETWORK_PROVIDER
in the RestaurantHelper.getLastKnownLocation()
method, but registering a LocationListener for the GPS_PROVIDER
in onCreate()
.
So, this code in RestaurantHelper.getLastKnownLocation()
:
Locationlocation= lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
...should be changed to:
Locationlocation= lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
In theory, this should then give you the latest GPS location, which should have been refreshed when you register the listener. Conversely, you could also change to listening to the NETWORK_PROVIDER
in onCreate()
and leave RestaurantHelper.getLastKnownLocation()
as is. It depends on your accuracy requirement - if you want high accuracy locations to return the nearest location to the nearest building level (e.g., 5-30m), you should use the GPS_PROVIDER
. But, if you can live with coarser accuracy, the NETWORK_PROVIDER
typically returns a new location much faster than GPS, especially if you're indoors, and sometimes this can be fairly accurate if derived from WiFi.
Another approach would be to listen to both GPS_PROVIDER
and NETWORK_PROVIDER
by registering both via two requestLocationUpdates()
lines in onCreate()
, and then checking to see most recent timestamp on the Location from lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
and lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
, and using the one that was updated more recently.
I would also recommend the following changes to make your code reliable on a large number of Android devices:
- Specify the
requestLocationUpdates()
minDistance
parameter as0
when listening for GPS or NETWORK location updates - the minDistance parameter has a history of being unreliable and unpredictable in the way its interpreted by OEMs, until Android 4.1. - Switch to the new Fused Location Provider - this should be much more reliable when calling the
getLastKnownLocation()
method than the Android framework location APIs, and more consistent across different devices. Note that this relies on Google Play Services SDK, which is only available on Android 2.2 and higher.
Solution 2:
I have 2 advice for you
LocationClient video, is the new way of doing location stuff. It has improvements over the LocationManager that can be a pain to manage and develop.
If you need to use LocationManager, you must know that requestLocationUpdates is buggy (very buggy). Since all its implementations on custom hardware differ. There is a hack/workaround that works. Before you call requestLocationUpdates, just kick start it with the following
Code :
HomeScreen.getLocationManager().requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 0, 0, new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onLocationChanged(final Location location) {
}
});
Solution 3:
requestLocationUpdates is buggy. Use network provider always to trigger onLocationChanged(...)
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 100, this)
only after using network provider use gps provider back to back:
locManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 1000, 100, this)
do not forget to check if gps is enabled or not before requesting location update by gps.
Post a Comment for "Android Locationmanager Requestlocationupdates Doesn't Work"