LocationManager возвращает старое кэшированное местоположение Wifi с текущей меткой времени

Я пытаюсь получить текущее местоположение. Для этого я реализую LocationListener и регистрирую его как для сети, так и для провайдера GPS:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 

Я блокирую его в течение 30 секунд и использую первое место, которое попадает в приемник

 onLocationChanged() 

С точностью 100 метров или лучше.

Большую часть времени это работает нормально. Если телефон подключен к какой-либо сети Wi-Fi, требуется около секунды, чтобы получить правильное местоположение с точностью около 50 метров. Если Wi-Fi отсутствует, но GPS включен, для получения места может потребоваться некоторое время.

Иногда, однако, при подключении к Wi-Fi и получении текущего местоположения предоставляется старое (кэшированное?) Предыдущее местоположение «Wifi» – оно может быть 15 минут и 15 километров от текущего местоположения. Проблема в том, что

 location.getTime() 

Возвращает текущее время, поэтому невозможно узнать, что место старое.

Я предполагаю, что мне нужно реализовать более сложное решение – я просто хотел бы знать, почему эти старые «Wifi» местоположения имеют текущую временную метку, а не одну, начиная с момента ее первоначального получения.

    Это полезно:

    Глубокое погружение в местоположение

    И, наконец, исходный код для этого разговора:

    андроид-protips-место

    Это известная проблема, с которой я столкнулся, и сделал некоторые исследования, почему это происходит.

    Вот мои наблюдения:

    • Обычно это происходит, когда передача мобильной сети происходит после потери сетевого подключения, которое может не обязательно быть достаточно значительным для пользователя.
    • Подумайте, что вы забираете трубку, и вы садитесь на станцию ​​A и садитесь на станцию ​​B, теперь, когда вы садитесь на станцию ​​B, идентификатор сотовой ячейки может / еще не быть на станции A, и, конечно же, Выключить и перейти на станцию ​​B.
    • Однако, если вы вызываете, чтобы getLocation активен до передачи, вы получите местонахождение станции A, которое может быть похоже на 10 км и 15 минут назад.

    Сначала поймите, как работает сеть: Android имеет cellId башни, к которой он подключен, и этот идентификатор затем используется Google для выполнения поиска и получения приблизительной информации о местоположении, точность которой может составлять от 50 метров (одна из Лучше всего) до нескольких тысяч метров. Если cellId неверен, как показано в приведенном выше примере, вы получите неправильное местоположение.

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

     if (location from network) { if (speed obtained from the difference between previous and current location is greater than say 30 m/s) { ignore this location as noise } else { location is correct } } 

    Я столкнулся с теми же проблемами, пока не внес некоторые изменения в свой код.

    Случилось так, что я привязывал один и тот же LocalListener при запросе обновлений GPS и сети, и я получал «странные» проблемы, включая получение старых обновлений местоположения WIFI с текущим временем.

    Вот мой старый код:

     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0, locationListener); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, locationListener); 

    По-видимому, это довольно «небезопасная» вещь (извините, новичок в Android здесь), и поэтому я изменил ее на:

     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0, networkLocationListener); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, gpsLocationListener); 

    Конечно, мне пришлось определить 2 отдельных блока onLocationChanged для обработки двух слушателей.

    Ну, это решило мою проблему. Я тестировал это на Gingerbread (API Level: 8). Не уверен, что он работает для вас.