Hi I have implemented Fused Location provider Api for getting location updates in a service. I was able to get the onlocationchanged event fired according to the interval set. However when i set the setsmallestDisplacement to 10 metres, the event is getting fired even if the device is still. Does any one have problem similar to this. please provide suggestions. Below is the code
mlocationrequest = LocationRequest.create();
mlocationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mlocationrequest.setInterval(60000); // Update location every 1 minute
mlocationrequest.setFastestInterval(10000);
mlocationrequest.setSmallestDisplacement(10);
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, mlocationrequest, this);
To find the distance between two location values i have used this method.
public static float distFrom (float lat1, float lng1, float lat2, float lng2 )
{
double earthRadius = 3958.75;
double dLat = Math.toRadians(lat2lat1);
double dLng = Math.toRadians(lng2lng1);
double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
Math.sin(dLng/2) * Math.sin(dLng/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1a));
double dist = earthRadius * c;
int meterConversion = 1609;
return new Float(dist * meterConversion).floatValue();
}
But i get the distances as 43.51 , 49.32 , 520.02 even when the device is Still. Is it because the tablet am using in indoor?
If the Displacement is set for LocationRequest, no chance of getting the locations if device is still as Displacement takes precedence over Intervals (interval and fastestInterval).
As I could guess – May be you have passed different LocationRequest object (with no displacement set) to LocationServices.FusedLocationApi.requestLocationUpdates().
I was looking for an answer to how locs are received if both interval and displacement set. I just verified for myself with my application and below is the behavior for different configuration for LocationRequest:

No Displacement parameter set
setInterval is set to 1 min and fastest to 1 min.I received location every one mins. But you see sometimes it received fast and sometimes slower which is because setInterval is inexact.
0603 11:46:55.408 2577625776/ MyLocationListener﹕ onLocationChanged.
0603 11:47:56.008 2577625776/MyLocationListener﹕ onLocationChanged.
0603 11:48:18.768 2577625776/MyLocationListener﹕ onLocationChanged.
0603 11:49:22.938 2577625776/MyLocationListener﹕ onLocationChanged.
0603 11:50:22.948 2577625776/MyLocationListener﹕ onLocationChanged.
0603 11:52:22.978 2577625776/MyLocationListener﹕ onLocationChanged.
0603 11:53:22.998 2577625776/MyLocationListener﹕ onLocationChanged.

Displacement parameter is set to 10 meters
setInterval as above 1 mins.No location updates are received if the device does not move or cross that distance. Between every onLocationChanged below I walked more than 10 meters so I received loc.
0603 11:26:53.328 1670916709/MyLocationListener﹕ onLocationChanged.
0603 11:35:38.318 1670916709/MyLocationListener﹕ onLocationChanged.
0603 11:39:16.728 1670916709/MyLocationListener﹕ onLocationChanged.
###
It may happen that you are getting different latlong in onLocationChanged
method which describes more displacement than 10. So kindly checkout the latlong which you are getting and measure the distance once manually to crossverify the things.
Apart from above, one more possible reason is matter of priority,
If above case seems fine then try like following:
mlocationrequest = LocationRequest.create();
mlocationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mlocationrequest.setSmallestDisplacement(10);
mlocationrequest.setInterval(60000); // Update location every 1 minute
mlocationrequest.setFastestInterval(10000);