Android LocationClient.getLastLocation() возвращает старое и неточное местоположение с новой отметкой времени
Я пользуюсь провайдером слияния с момента его выпуска и очень доволен им (намного лучше, чем старая система). Но я столкнулся с особой проблемой при использовании геозоны в сочетании с LocationClient.lastKnownLocation(). Установка выглядит следующим образом:
Я бросил несколько геозон вокруг какого-то дома (с увеличением дальности). Когда я получаю намерение пересечь забор, я получаю последнее известное местоположение из LocationClient и работаю с ним. Помимо этого я также зарегистрировался для регулярных обновлений местоположения в режиме обновления PRIORITY_BALANCED_POWER_ACCURACY.
В большинстве случаев это работает отлично, но иногда это происходит:
Время 000 с - (широта, долгота, точность) = (48.127316,11.5855167 683,0)
Время 120 с - (широта, долгота, точность) = (48.1260497,11.5731745,31.823)
Время 300 с - (широта, долгота, точность) = (48,1217455,11,5641666,143,81)
Время 420 с - (широта, долгота, точность) = (48.1189942,11.559061,36.0)
Время 600 с - (широта, долгота, точность) = (48.127316,11.5855167 683,0)
Обратите внимание, что все эти местоположения извлекаются методом getLastKnownLocation (). Здесь кажется подозрительным то, что первое и последнее местоположение идентичны (даже в других атрибутах), чтобы быть более конкретным:
* intent at time 0: *
component: ComponentInfo{package.Class}
key [location]: Location[mProvider=fused,mTime=1373524391934,mLatitude=48.127316,mLongitude=11.5855167,mHasAltitude=false,mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,mHasBearing=false,mBearing=0.0,mHasAccuracy=true,mAccuracy=683.0,mExtras=Bundle[mParcelledData.dataSize=352]]
* intent at time 600: *
component: ComponentInfo{package.Class}
key [location]: Location[mProvider=fused,mTime=1373524994871,mLatitude=48.127316,mLongitude=11.5855167,mHasAltitude=false,mAltitude=0.0,mHasSpeed=false,mSpeed=0.0,mHasBearing=false,mBearing=0.0,mHasAccuracy=true,mAccuracy=683.0,mExtras=Bundle[mParcelledData.dataSize=352]]
* note the ~600 s difference in the timestamp *
Я не понимаю, как это может произойти, потому что между ними были места, которые были более свежими и более точными. Кроме того, новая временная метка в старом местоположении делает меня любопытным... очевидно, подобные вещи происходили при использовании старого API, но этот новый поставщик местоположения просто называется fused
поэтому я не могу отличить GPS от WPS от датчиков... Если это проблема переключения вышек сотовой связи (обрисованная в общих чертах в связанном вопросе о старом API), то зачем телефону подключаться к "далекой" вышке, если он видел ближе башни?
Почему это происходит?
3 ответа
Первый и последний баллы были получены с помощью триангуляции клеток. Ошибка / точность типичны для местоположения на основе ячейки, и похоже, что логика энергосбережения Google решила, что переключение на ячейку будет в порядке, даже если вы говорите, что его недавняя история включала точки гораздо ближе.
Вместо опроса, можно использовать один или несколько источников неточностей, используя этот механизм подписки.
LocationListener locListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
if (location == null)
return;
// process these:
// location.getLatitude();
// location.getLongitude();
// location.getAccuracy();
...
}
...
}
((LocationManager) getSystemService(Context.LOCATION_SERVICE)
.requestLocationUpdates(LocationManager.GPS_PROVIDER,
minTimeMilliSec,
minDistanceMeters,
locListener));
Ой, ШУКС! Я тоже получил это сегодня... И я переехал в новое местоположение Служб Google Play именно для того, чтобы ИЗБЕГАТЬ этого... И я был так взволнован до тех пор, пока не получил его тоже. Вы можете знать или не знать, что у старого были такие проблемы, и это была боль.
Есть много тем по этому поводу, включая мою собственную:(
Почему locationmanager возвращает старые исправления местоположения с новым gettime-timestamp?
Я думаю, единственное, что нужно сделать, это избегать использования кэшированного местоположения...