Продвинутое местоположение провайдера setsmallestDisplacement не работает в Android

Привет, я реализовал провайдера Fused Location Api для получения обновлений местоположения в службе. Я смог получить событие onlocationchanged, запущенное в соответствии с заданным интервалом. Однако, когда я устанавливаю setmallestDisplacement на 10 метров, событие запускается, даже если устройство все еще. Есть ли у кого-то проблемы, подобные этому. пожалуйста, предоставьте предложения. Ниже приведен код

    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);

Чтобы найти расстояние между двумя значениями местоположения, я использовал этот метод.

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();
}

Но я получаю расстояния как 43.51, 49.32, 520.02, даже когда устройство все еще. Это потому, что планшет используется в помещении?

Ответы

Ответ 1

Если Displacement установлен для LocationRequest, нет шансов получить места, если устройство по-прежнему находится, поскольку перемещение имеет приоритет по сравнению с интервалами (интервал и fastestInterval). Как я мог догадаться - возможно, вы передали другой объект LocationRequest (без набора смещений) в LocationServices.FusedLocationApi.requestLocationUpdates().

Я искал ответ на то, как получаются locs, если установлены оба интервала и смещения. Я просто проверил для себя с моим приложением, а ниже - поведение для различной конфигурации для LocationRequest:

  • Нет набора параметров смещения
    setInterval устанавливается в 1 мин и максимально быстро до 1 мин.

    Я получил место каждые минуты. Но вы видите, что иногда это получалось быстро, а иногда и медленнее, что установленоInterval неточно.

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. Параметр смещения установлен на 10 метров
    setInterval, как указано выше 1 мин.

    Никакие обновления местоположения не принимаются, если устройство не перемещается и не пересекает это расстояние. Между каждым onLocationChanged ниже я шел более 10 метров, поэтому я получил 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.

Ответ 2

Может случиться так, что вы получаете различный lat-long в методе onLocationChanged, который описывает большее перемещение, чем 10. Так что любезно проверяйте lat-long, который вы получаете, и измерьте расстояние вручную, чтобы перепроверить вещи.

Помимо вышеизложенного, еще одной возможной причиной является вопрос приоритетности, Если вышеприведенный случай кажется прекрасным, попробуйте следующее:

 mlocationrequest = LocationRequest.create();
mlocationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mlocationrequest.setSmallestDisplacement(10);
mlocationrequest.setInterval(60000); // Update location every 1 minute
mlocationrequest.setFastestInterval(10000);