Поставщик слияния местоположения 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:
Параметр смещения не задан
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.
Параметр смещения установлен на 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);