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

Привет, я реализовал API поставщика плавленого местоположения для получения обновлений местоположения в службе. Мне удалось запустить событие 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().

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

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

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

06-03 11:46:55.408 25776-25776/ MyLocationListener on onLocationChanged.
06-03 11: 47: 56.008 25776-25776/ mylocationlistener on onLocationChanged.
06-03 11: 48: 18.768 25776-25776/mylocationlistener on onLocationChanged.
06-03 11:49: 22.938 25776-25776/mylocationlistener on onLocationChanged.
06-03 11: 50: 22.948 25776-25776/mylocationlistener on onLocationChanged.
06-03 11: 52: 22.978 25776-25776/mylocationlistener on onLocationChanged.
06-03 11:53: 22.998 25776-25776/mylocationlistener on onLocationChanged.

  1. параметр смещения установлен в 10 метров
    setInterval как выше 1 минут.

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

06-03 11:26:53.328 16709-16709/MyLocationListener on onLocationChanged.
06-03 11: 35:38.318 16709-16709 / MyLocationListener﹕ метода onlocationchanged.
06-03 11:39: 16.728 16709-16709/mylocationlistener on onLocationChanged.


может случиться так, что вы получаете разные 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);