Api setSmallestDisplacement locked location ignored / not working

I am trying to create a service that will receive location updates every x seconds and after y distance. I get updates after x sec, but not after y distance. I tested it several times with different values, and it seems that setSmallestDisplacement does not work at all. There were different posts, but without any solution. I would appreciate it if someone would help me or even point me in a different direction.

My service

public class GPS_Service extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { private GoogleApiClient mGoogleApiClient; private LocationRequest mLocationRequest; private int timethresh; private int distancethresh; protected Location mCurrentLocation; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(LocationServices.API) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .build(); mGoogleApiClient.connect(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { mLocationRequest = new LocationRequest(); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); //Set the desired interval for active location updates, in milliseconds. mLocationRequest.setInterval(60* 1000); //Explicitly set the fastest interval for location updates, in milliseconds. mLocationRequest.setFastestInterval(30* 1000); //Set the minimum displacement between location updates in meters mLocationRequest.setSmallestDisplacement(1); // float return super.onStartCommand(intent, flags, startId); } @Override public void onConnected(Bundle bundle) { if (mCurrentLocation == null) { mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); } //Requests location updates from the FusedLocationApi. startLocationUpdates(); } @Override public void onLocationChanged(Location location) { mCurrentLocation = location; //Toast.makeText(this, ""+mCurrentLocation.getLatitude()+","+mCurrentLocation.getLongitude(), Toast.LENGTH_SHORT).show(); System.out.println(""+mCurrentLocation.getLatitude()+","+mCurrentLocation.getLongitude()); } @Override public void onConnectionSuspended(int i) { // The connection to Google Play services was lost for some reason. We call connect() to // attempt to re-establish the connection. mGoogleApiClient.connect(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Toast.makeText(getApplicationContext(),"Location services connection failed with code " + connectionResult.getErrorCode(), Toast.LENGTH_LONG).show(); } protected void startLocationUpdates() { LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, this); } 

}

+6
source share
2 answers

Accordingly, SO question , especially cgr answer.

The offset set for LocationRequest has no chance of gaining space if the device is still located, since the move has a precedent over Intevals (interval and fastestInterval). As I might have guessed - you might have passed another LocationRequest object (without a set of offsets) to LocationServices.FusedLocationApi.requestLocationUpdates ().

LocationRequestSmallestDisplacement set (float smallestDisplacementMeters)

sets the minimum offset between updating the location in meters. By default, this value is 0. It returns the same object, so setters can be chained.

NOTE. Location requests from applications with ACCESS_COARSE_LOCATION and no ACCESS_FINE_LOCATION will automatically throttle to a slower interval, and the location object will get confused only show a rough level of accuracy.

See page for details.

+4
source

Try something like this:

 protected void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationRequest.setSmallestDisplacement(100); //100 meters } 
+2
source

All Articles