onLocationChanged always returns I old location

android, locationmanager

Solution

You are getting old location because of this line

  location = mgr.getLastKnownLocation(best);

because if GPS is not enabled then it will show you the old location . So remove this code It will work like a champ You can also refer to this library

https://github.com/nagendraksrivastava/Android-Location-Tracking-Library

On the basis of your comments I have edited the answer Okay Let me explain line by line `location = mgr.getLastKnownLocation(best);` it will give you object of last know location then it will go inside if condition and it will call dumplocation and will get last location data and after that you called

mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                10 * 1000, 50, this);

but suppose GPS provider is disabled then it will not fetch new location so you will get old location only . So either you can change it like

if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
                   {
                    locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,new NagendraSingleLocationListener(),null);
                   }
                   else
                   {
                       locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,new NagendraSingleLocationListener(),null);
                   }

Problem

I have registered my LocationManager for location updates, every 10 seconds ``` mgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10 * 1000, 50, this); ``` But the `onLocationChanged` callback returns a location every 10 secs, which(the location) is more than 2 hours old. And that time-stamp is never changing. The problem is: 2 hours back I was in a complete different location(home) where I used the device on a wifi. Now currently I am in some other location(office) on a different wifi where my application shows my current location as home. Same thing happened at home yesterday, when it was showing office as my current location. It got to work(started showing correct location) when I closed my app, opened FourSquare app and re-opened my app. Complete Code: ``` public class LocationService extends Service implements LocationListener { public static double curLat = 0.0; public static double curLng = 0.0; private LocationManager mgr; private String best; private Location location; @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { mgr = (LocationManager) getSystemService(LOCATION_SERVICE); best = LocationManager.NETWORK_PROVIDER; location = mgr.getLastKnownLocation(best); if (location != null) { dumpLocation(location); mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10 * 1000, 50, this); } return START_NOT_STICKY; } } private void dumpLocation(Location l) { SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyyy:hh:mm:ss", Locale.ENGLISH); String format = s.format(l.getTime()); //The above time is always 28/03/2013:09:26:41 which is more than 2 hrs old curLat = l.getLatitude(); curLng = l.getLongitude(); } @Override public void onLocationChanged(Location location) { dumpLocation(location); } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } } ``` Being started in an Activity this way: ``` AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); Intent i = new Intent(this, LocationService.class); pi = PendingIntent.getService(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); am.cancel(pi); am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10000, pi); ``` Permissions in manifest: ``` <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> ``` I can get the correct location now, by opening some other location based app like Maps, Navigator, Foursquare etc.., But why my app isn't able to get a new/fresh fix from the provider. Thank You

Original source

Related problems