26

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(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    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(1-a));
    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?

hemanth kumar
  • 3,068
  • 10
  • 41
  • 64

2 Answers2

46

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:

  1. 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.

06-03 11:46:55.408 25776-25776/ MyLocationListener﹕ onLocationChanged.
06-03 11:47:56.008 25776-25776/MyLocationListener﹕ onLocationChanged.
06-03 11:48:18.768 25776-25776/MyLocationListener﹕ onLocationChanged.
06-03 11:49:22.938 25776-25776/MyLocationListener﹕ onLocationChanged.
06-03 11:50:22.948 25776-25776/MyLocationListener﹕ onLocationChanged.
06-03 11:52:22.978 25776-25776/MyLocationListener﹕ onLocationChanged.
06-03 11:53:22.998 25776-25776/MyLocationListener﹕ onLocationChanged.

  1. 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.

06-03 11:26:53.328 16709-16709/MyLocationListener﹕ onLocationChanged.
06-03 11:35:38.318 16709-16709/MyLocationListener﹕ onLocationChanged.
06-03 11:39:16.728 16709-16709/MyLocationListener﹕ onLocationChanged.

cgr
  • 4,578
  • 2
  • 28
  • 52
  • 1
    experienced the same..! – Gagan Jul 25 '16 at 11:25
  • 3
    I have displacement set at 10, setInterval and setFastestInterval set at 3 minutes yet even with significant movement I don't receive regular location updates not sure where is the issue? – 2cupsOfTech Oct 08 '16 at 03:32
  • It's depending on whether you are on Cell nw or WiFi. If you're on WiFi, you should get it after 10m walk. If you are on cell, try walking bit more and see. – cgr Oct 08 '16 at 15:06
  • In 2nd scenario its necessary both the condition must be fulfil? – RobinHood Sep 28 '17 at 10:02
  • Tnx a lot, this explanation was perfect – vinidog Oct 15 '17 at 12:31
  • I think you need to specify here that if Displacement is set to 10 meters and setInterval is 5 mins and user travels 10 meters, still user will receive location update in 5 mins. – NinjaCoder Oct 26 '17 at 17:27
  • @cgr Deep what should I do in case I need to consider both the parameters together? for example "every 10 seconds or 50 meters, whichever is true first." – hushed_voice Jul 13 '19 at 19:19
6

It may happen that you are getting different lat-long in onLocationChanged method which describes more displacement than 10. So kindly checkout the lat-long which you are getting and measure the distance once manually to cross-verify 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);
Mehul Joisar
  • 15,348
  • 6
  • 48
  • 57
  • I have edited the question with further details.Please go through it once. Also Changed the priority of the statements as you said still the result is same. – hemanth kumar Jan 05 '15 at 11:55
  • 1
    Yes, accuracy does matter. You may checkout accuracy of the location which you get in `onLocationChanged` method. 10m is very small distance to track. and generally we get the accuracy of 30m most of the time. – Mehul Joisar Jan 05 '15 at 12:28
  • 1
    good point from @MehulJoisar. The accuracy can be off by as much as 100m if you are in a densely populated (with buildings) urban area and/or cloudy day. – Bamerza Jun 07 '19 at 20:14
  • I've found that rain and snow can also really mess up the coordinates – Someone Somewhere Jul 10 '19 at 23:54
  • @Bamerza Deep what should I do in case I need to consider both the parameters together? for example "every 10 seconds or 50 meters, whichever is true first." – hushed_voice Jul 13 '19 at 19:21
  • @free_style - Not so sure that is easily possible. When setting displacement AND update-interval, the OS will also 'AND' the two. So, once both conditions are met, then the location update will be processed. You can set both, but may have to set a timer and track if an update was made during the elapsed time and then trigger it yourself. – Bamerza Aug 01 '19 at 19:08
  • I tried setting both but the displacement blocks the time-based update. The workaround is to set 2 location requests. Just posting to point someone in the right direction later on. – hushed_voice Aug 02 '19 at 09:24