0

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();
ΩlostA
  • 2,501
  • 5
  • 27
  • 63
  • Does this answer your question? [Fused Location Provider setsmallestDisplacement doesn't work in Android](https://stackoverflow.com/questions/27778707/fused-location-provider-setsmallestdisplacement-doesnt-work-in-android) – Jemshit Jul 18 '23 at 06:17
  • @Jemshit nope, it doesn't do the job. Only the distance parameter is fired, not the timer one in the example... – ΩlostA Jul 18 '23 at 09:01
  • Edit the code, usage of `locationRequest` is not shown – Jemshit Jul 18 '23 at 09:14
  • @Jemshit I put the initialization of locationRequest, and when the function onLocationResult for the trigging part, I don't need other code for this app. That works very well with the distance, but not the timer. I think the problem is that if you put the setSmallestDisplacement, you cannot get the setInterval. I am going to try to get one locationRequest for the distance, and one for the interval – ΩlostA Jul 18 '23 at 09:35
  • 1
    You state distance doesn't work in the question, now you say distance is working but timer is not working. Link provided states `Displacement takes precedence over Intervals` – Jemshit Jul 18 '23 at 09:48
  • Yep, that's what I see now, is that you can get one or the other, not both. So I splitted in two, and now it works. I created two locationRequest for this. – ΩlostA Jul 18 '23 at 10:06
  • 1
    @Jemshit Your link is the good one, but I am going to put the complete solution to help people if necessary. Thank you for your help. – ΩlostA Jul 18 '23 at 12:10

1 Answers1

0

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;
        }
       }
ΩlostA
  • 2,501
  • 5
  • 27
  • 63