javaandroidlocationandroid-fusedlocationlocationrequest

How to get the onLocationResult be triggered all the 30m of displacement in a LocationRequest with the locationCallback?


I don't understand, the Interval in milliseconds works well, but the minimum distance doesn't work. How to get the onLocationResult be triggered all the 30m of displacement in a LocationRequest with the locationCallback ?

  if (locationRequest == null) {
            locationRequest = new LocationRequest();

            if (drivingtype == Constants.DRIVING_TYPE_BICYCLE) {
                locationRequest.setInterval(Constants.GPS_UPDATE_TIMING_PRECISION);
                locationRequest.setFastestInterval(Constants.GPS_UPDATE_PRECISION);
                locationRequest.setSmallestDisplacement(30f);
            } else {
                locationRequest.setInterval(Constants.GPS_UPDATE_TIMING_PRECISION);
                locationRequest.setFastestInterval((Constants.GPS_UPDATE_PRECISION) / 4);
                locationRequest.setSmallestDisplacement(30f);
            }

        locationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER );
        }
        if (locationCallback == null) {
            locationCallback = new LocationCallback() {
                @Override
                public void onLocationResult(LocationResult locationResult) {
                    Location location = locationResult.getLastLocation();
                    if (location != null) {
                        // Traitement des mises à jour de localisation
                        // La position a changé. Obtenez les coordonnées et mettez à jour la carte.
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();

Solution

  • SOLUTION:

    Based on the answer proponed by @Jemshit,

    //Time

        if (locationRequest == null) {
            locationRequest = LocationRequest.create();
    
                if (drivingtype == Constants.DRIVING_TYPE_BICYCLE) {
                    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                   // locationRequest.setSmallestDisplacement(Constants.GPS_UPDATE_PRECISION);
                    locationRequest.setInterval(Constants.GPS_UPDATE_TIMING_PRECISION); // Update location every 1 minute
                    locationRequest.setFastestInterval(10000);
                } else {
                    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                 //   locationRequest.setSmallestDisplacement(Constants.GPS_UPDATE_PRECISION / 4);
                    locationRequest.setInterval(Constants.GPS_UPDATE_TIMING_PRECISION); // Update location every 1 minute
                    locationRequest.setFastestInterval(10000);
                }
    
            }
    
            if (locationCallback == null) {
                locationCallback = new LocationCallback() {
                    @Override
                    public void onLocationResult(LocationResult locationResult) {
                        Location location = locationResult.getLastLocation();
                        if (location != null) {
                            // Traitement des mises à jour de localisation
                            // La position a changé. Obtenez les coordonnées et mettez à jour la carte.
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                            map.getOverlays().clear();
    
                            // Mettez à jour la carte avec la nouvelle position.
                            // Par exemple, utilisez les fonctions de OsmAnd pour déplacer la caméra ou ajouter un marqueur.
                            GeoPoint currentPosition = new GeoPoint(latitude, longitude);
                            //moveMapCameraToPosition(currentPosition); // Déplace la caméra vers la nouvelle position
                            animateMapCameraToPosition(currentPosition);
    
                            map.getOverlays().remove(accuracyOverlay);
                            int greenColorWithOpacity = Color.argb(128, 0, 255, 0);
                            accuracyOverlay = new AccuracyOverlay(new GeoPoint(location), Constants.ACCURACYOVERLAYPRECISION, greenColorWithOpacity);
                            map.getOverlayManager().getTilesOverlay().setLoadingBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.black));
                            map.getOverlays().add(accuracyOverlay);
                            map.invalidate();
    
                            // Vous pouvez également ajouter un marqueur à la position actuelle
                            addMarkerToPosition(currentPosition);
    
                            // Envoi de la position à l'API
                            sendPositionToAPI(latitude, longitude);
                        }
                    }
                };
            }
    

    //Distance

            if (locationRequest2 == null) {
                locationRequest2 = new LocationRequest();
    
                if (drivingtype == Constants.DRIVING_TYPE_BICYCLE) {
                    locationRequest2.setSmallestDisplacement(Constants.GPS_UPDATE_PRECISION);
                } else {
                    locationRequest2.setSmallestDisplacement(Constants.GPS_UPDATE_PRECISION);
                }
    
                locationRequest2.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY );
            }
            if (locationCallback2 == null) {
                locationCallback2 = new LocationCallback() {
                    @Override
                    public void onLocationResult(LocationResult locationResult) {
                        Location location = locationResult.getLastLocation();
                        if (location != null) {
                            // Traitement des mises à jour de localisation
                            // La position a changé. Obtenez les coordonnées et mettez à jour la carte.
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                            map.getOverlays().clear();
    
                            // Mettez à jour la carte avec la nouvelle position.
                            // Par exemple, utilisez les fonctions de OsmAnd pour déplacer la caméra ou ajouter un marqueur.
                            GeoPoint currentPosition = new GeoPoint(latitude, longitude);
                            //moveMapCameraToPosition(currentPosition); // Déplace la caméra vers la nouvelle position
                            animateMapCameraToPosition(currentPosition);
    
                            map.getOverlays().remove(accuracyOverlay);
                            int greenColorWithOpacity = Color.argb(128, 0, 255, 0);
                            accuracyOverlay = new AccuracyOverlay(new GeoPoint(location), Constants.ACCURACYOVERLAYPRECISION, greenColorWithOpacity);
                            map.getOverlayManager().getTilesOverlay().setLoadingBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.black));
                            map.getOverlays().add(accuracyOverlay);
                            map.invalidate();
    
                            // Vous pouvez également ajouter un marqueur à la position actuelle
                            addMarkerToPosition(currentPosition);
    
                            // Envoi de la position à l'API
                            sendPositionToAPI(latitude, longitude);
                        }
                    }
                };
            }
    
            Looper mainLooper = Looper.getMainLooper();
            Looper mainLooper2 = Looper.getMainLooper();
    
            if (!locationUpdatesEnabled) {
                fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, mainLooper);
                fusedLocationClient2.requestLocationUpdates(locationRequest2, locationCallback2, mainLooper2);
                locationUpdatesEnabled = true;
            }
           }