From what is specified[difference of 4-5 blocks], you may be obtaining the location
from networkProvider
only.
With this gpsTracker
code mentioned in the question,
there are a few modifications required, instead of using the code as it is:
1.
There are 2 if
loops which verify the source of location
is enabled or not and No 'else
':
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
This means the application is going to do twice the work when you can obtain the location
from both sources. Further, the source of location
obtained always remains ambiguous.
This is good when you just need approximate location
which should not be null majorly.
If you want to use only this class to obtain location
, try structuring the if-else
according to requirement and ensuring that its not going to repeat if the location
is obtained.
Eg. if GPS
is on a higher preference, applies in your case, shift that if
above and put the network condition with an else
like:
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
} else if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
For your requirement, i suggest removing the network provider part and obtaining the location
only from GPS, esp if line of sight is not a problem.
When your code was working fine, it must be fetching the location from GPS and setting it in the object. But because of the two "if
" and no "else
", you'l never know whether location
obtained is from Network or GPS - you can check location.getProvider() inside the condition of canGetLocation()
2.
Also, you can log the message or prompt some action for one particular source...like:
In this part:
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
}
just separate it into two different if
(s) and code accordingly. As of now, nothing happens here so you wouldn't know if both are disabled unless you check it externally.
Suggestion: Try the LocationClient which uses GooglePlayServices for Retrieving Current Location . I have found it more reliable and useful. Check this Fused Location Provider example, setting LocationRequest object according to your requirement is the key.
Another update: just came across: useful ques on stack overflow - Good way of getting the users location
Update for anybody looking up this question/answer
Regarding the suggestion of LocationClient;
LocationClient is no longer found under com.google.android.gms.location
, refer:
Android play services 6.5: LocationClient is missing