Поставщик слияния местоположения setsmallestDisplacement не работает в Android

Привет, я реализовал Api от Fused Location для получения обновлений местоположения в сервисе. Мне удалось запустить событие onlocationchanged согласно заданному интервалу. Однако, когда я установил setsmallestDisplacement на 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, даже когда устройство все еще. Это потому что планшет использую в помещении?

2 ответа

Решение

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

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

  1. Параметр смещения не задан
    setInterval установлен в 1 мин, а самый быстрый в 1 мин.

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

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.

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

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

 mlocationrequest = LocationRequest.create();
mlocationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mlocationrequest.setSmallestDisplacement(10);
mlocationrequest.setInterval(60000); // Update location every 1 minute
mlocationrequest.setFastestInterval(10000);
Другие вопросы по тегам