Best Android Way to Get Current Location

What is the best way to get the current location in android for the following scenario,

  • If GPS is not available, find the location from your network provider.

  • If GPS is available and can get the current location, find the location from the GPS provider

  • If GPS is available but cannot get the current location (i.e. constantly search for a location), get the location from the network provider.

    now I can get the location from the network if gps is not available, the best answer to satisfy the above scenario is highly appreciated. thank you in advance.

+6
source share
3 answers

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: /* * Toast.makeText(getApplicationContext(), "Got First Fix", * Toast.LENGTH_LONG).show(); */ break; case GpsStatus.GPS_EVENT_STARTED: /* * Toast.makeText(getApplicationContext(), "GPS Event Started", * Toast.LENGTH_LONG).show(); */ break; case GpsStatus.GPS_EVENT_STOPPED: /* * Toast.makeText(getApplicationContext(), "GPS Event Stopped", * Toast.LENGTH_LONG).show(); */ 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); //callback method which will be defined in your class. 

}

Your class should implement the listener described above. In your class:

 @Override public void onLocationReceived(Location mLoc) { //Do your stuff } 

Hope this helps. If anyone has a better approach, please let me know.

+2
source
 If GPS is available and can get current location, 

For the above question, you can try like this.

Using this, you can get the latitude and longitude for the current location, and then pass the value to get the map.

 public class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location loc) { loc.getLatitude(); loc.getLongitude(); String Text = "My current location is: " + "Latitud = " + loc.getLatitude() + "Longitud = " + loc.getLongitude(); Toast.makeText( getApplicationContext(), Text, Toast.LENGTH_SHORT).show(); } @Override public void onProviderDisabled(String provider) { Toast.makeText( getApplicationContext(), "Gps Disabled", Toast.LENGTH_SHORT ).show(); } @Override public void onProviderEnabled(String provider) { Toast.makeText( getApplicationContext(), "Gps Enabled", Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } } } 
0
source

member of the boolean mIsGpsFix class boolean mIsGpsFix ;

Request GPS location update and set countdown timer

 mCountDown.start(); private CountDownTimer mCountDown = new CountDownTimer(time to wait for Gps fix, same as right) { @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { // No fix after the desire amount of time collapse if (!mIsGpsFix) // Register for Network } }; 
0
source

All Articles