Well, you can use Timer and TimerTask .
LocationManager manager; TimerTask mTimertask; GPSLocationListener mGPSLocationListener; int i = 0; //Here i works as counter; private static final int MAX_ATTEMPTS = 250; public void getCurrentLocation() { manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); mGPSLocationListener = new GPSLocationListener(); manager.addGpsStatusListener(mGPSStatusListener); mTimerTask = new LocTimerTask(LocationManager.GPS_PROVIDER); if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { Log.v(TAG, "GPS ENABLED"); manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 50.0f, mGPSLocationListener); } else { turnGPSOn(); manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 50.0f, mGPSLocationListener); } if(manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L, 50.0f, mNetworkLocationListener); } if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { Log.v(TAG, "GPS ENABLED"); manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000L, 50.0f, mGPSLocationListener); } myLocTimer = new Timer("LocationRunner", true); myLocTimer.schedule(mTimerTask, 0, 500); }
GPSStatusListener
private GpsStatus.Listener mGPSStatusListener = new GpsStatus.Listener() { @Override public synchronized void onGpsStatusChanged(int event) { switch (event) { case GpsStatus.GPS_EVENT_SATELLITE_STATUS: Log.v(TAG, "GPS SAtellitestatus"); GpsStatus status = manager.getGpsStatus(null); mSattelites = 0; Iterable<GpsSatellite> list = status.getSatellites(); for (GpsSatellite satellite : list) { if (satellite.usedInFix()) { mSattelites++; } } break; case GpsStatus.GPS_EVENT_FIRST_FIX: break; case GpsStatus.GPS_EVENT_STARTED: break; case GpsStatus.GPS_EVENT_STOPPED: break; default: break; } } };
Locationlistener
public class GPSLocationListener implements LocationListener { @Override public void onLocationChanged(Location argLocation) { location = argLocation; } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } }
Class TimerTask
class LocTimerTask extends TimerTask { String provider; public LocTimerTask(String provider) { this.provider = provider; } final Handler mHandler = new Handler(Looper.getMainLooper()); Runnable r = new Runnable() { @Override public void run() { i++; Log.v(TAG, "Timer Task run" + i); location = manager.getLastKnownLocation(provider); if (location != null) { Log.v(TAG, "in timer task run in if location not null"); isGPS = true; onLocationReceived(location); myLocTimer.cancel(); myLocTimer.purge(); mTimerTask.cancel(); return; } else { Log.v(TAG, "in timer task run in else location null"); isGPS = false; if (location == null && i == MAX_ATTEMPTS) { Log.v(TAG, "if 1 max attempts done"); turnGPSOff(); location = manager .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { Log.v(TAG, "if 1 max attempts done Location from network not null"); Log.v(TAG, "if 1 max attempts done Location from network not null coordinates not null"); onLocationReceived(location); myLocTimer.cancel(); myLocTimer.purge(); mTimerTask.cancel(); return; } } else { return; } } i = 0; } }; public void run() { mHandler.post(r); } }
Here, the timer should start every 500 milliseconds. This means that every 500 milliseconds the run method timer task will run method . In startup mode, try to find a location with a GPS provider for a specific no. attempts ( Here MAX_ATTEMPTS ) say 5 or 10. If he gets a seat in the specified no. attempts then to use this location if the counter value ( Here i ) has exceeded MAX_ATTEMPTS, and then get the location from the network provider. upon receiving the location, I passed this place to the onLocationReceived(Location mLoc) callback method, in which you can continue your work with location data. Here's how you will use the callback method:
Listener
public interface OnLocationReceivedListener { public void onLocationReceived(Location mLoc);
}
Your class should implement the listener described above. In your class:
@Override public void onLocationReceived(Location mLoc) {
Hope this helps. If anyone has a better approach, please let me know.