Created
March 17, 2017 04:42
-
-
Save trinadhkoya/5637438d977f75ca111486666a03d35b to your computer and use it in GitHub Desktop.
Better way of getting the user's location in Android
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* try to get the 'best' location selected from all providers | |
*/ | |
private Location getBestLocation() { | |
Location gpslocation = getLocationByProvider(LocationManager.GPS_PROVIDER); | |
Location networkLocation = | |
getLocationByProvider(LocationManager.NETWORK_PROVIDER); | |
// if we have only one location available, the choice is easy | |
if (gpslocation == null) { | |
Log.d(TAG, "No GPS Location available."); | |
return networkLocation; | |
} | |
if (networkLocation == null) { | |
Log.d(TAG, "No Network Location available"); | |
return gpslocation; | |
} | |
// a locationupdate is considered 'old' if its older than the configured | |
// update interval. this means, we didn't get a | |
// update from this provider since the last check | |
long old = System.currentTimeMillis() - getGPSCheckMilliSecsFromPrefs(); | |
boolean gpsIsOld = (gpslocation.getTime() < old); | |
boolean networkIsOld = (networkLocation.getTime() < old); | |
// gps is current and available, gps is better than network | |
if (!gpsIsOld) { | |
Log.d(TAG, "Returning current GPS Location"); | |
return gpslocation; | |
} | |
// gps is old, we can't trust it. use network location | |
if (!networkIsOld) { | |
Log.d(TAG, "GPS is old, Network is current, returning network"); | |
return networkLocation; | |
} | |
// both are old return the newer of those two | |
if (gpslocation.getTime() > networkLocation.getTime()) { | |
Log.d(TAG, "Both are old, returning gps(newer)"); | |
return gpslocation; | |
} else { | |
Log.d(TAG, "Both are old, returning network(newer)"); | |
return networkLocation; | |
} | |
} | |
/** | |
* get the last known location from a specific provider (network/gps) | |
*/ | |
private Location getLocationByProvider(String provider) { | |
Location location = null; | |
if (!isProviderSupported(provider)) { | |
return null; | |
} | |
LocationManager locationManager = (LocationManager) getApplicationContext() | |
.getSystemService(Context.LOCATION_SERVICE); | |
try { | |
if (locationManager.isProviderEnabled(provider)) { | |
location = locationManager.getLastKnownLocation(provider); | |
} | |
} catch (IllegalArgumentException e) { | |
Log.d(TAG, "Cannot acces Provider " + provider); | |
} | |
return location; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment