LocationManager devuelve la antigua ubicación en caché "Wifi" con la marca de hora actual

Estoy tratando de obtener la ubicación actual. Para eso implemento un LocationListener y lo registro tanto para la red como para el proveedor de GPS:

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

Bloqueo entonces por 30 segundos y uso la primera localización que se pasa en el oyente

 onLocationChanged() 

Con una precisión de 100 metros o mejor.

La mayoría de las veces esto funciona bien. Si el teléfono está conectado a alguna red Wifi, sólo toma un segundo para obtener una ubicación correcta con una precisión de unos 50 metros. Si no hay Wifi pero GPS está habilitado, por supuesto, puede tomar un tiempo para obtener una ubicación.

A veces sin embargo, cuando se conecta a un Wifi y obtener la ubicación actual, algunos antiguos (en caché?) Anterior "Wifi" ubicación se proporciona – puede ser de 15 minutos de edad y 15 kilómetros de la ubicación actual. El problema es ese

 location.getTime() 

Devuelve la hora actual – por lo que es imposible saber que la ubicación es antigua.

Supongo que tengo que implementar una solución más elaborada – Me gustaría saber por qué estas viejas ubicaciones "Wifi" tienen una marca de tiempo actual en lugar de una desde el momento en que se recuperó originalmente.

Esto es útil:

Una inmersión profunda en la ubicación

Y por último el código fuente de esa charla:

Android-protips-ubicación

Este es un problema conocido que he encontrado y que hizo algunas investigaciones sobre por qué esto sucede.

Aquí están mis observaciones:

  • Por lo general, esto ocurre cuando la transferencia de red móvil está ocurriendo después de perder la conectividad de red que puede no ser necesariamente lo suficientemente significativa para que el usuario se dé cuenta.
  • Considere que usted está tomando un tren de tubo y usted consigue adentro en la estación A y consigue abajo en la estación B, ahora cuando usted consigue abajo en la estación B la identificación de la célula de la red puede / maynot todavía ser de la estación A y por supuesto hará un hands- Apagado y pasar a la estación B.
  • Sin embargo, si usted llama para getLocation está activo antes de la entrega que se obtendría la estación de una ubicación que podría ser como 10 km y 15 minutos atrás.

En primer lugar entender cómo funciona la red de ubicación: Android tiene el cellId de la torre a la que está conectado actualmente y este id es utilizado por google para realizar la búsqueda y obtener información de ubicación aproximada cuya precisión puede oscilar entre 50 metros (uno de los Mejor) a unos pocos miles de metros. Si el cellId es incorrecto como se muestra en el ejemplo anterior, entonces recibirá una ubicación incorrecta.

No hay mucho que puede hacer para evitar esto, excepto tener un algoritmo personalizado que puede eliminar este ruido. Algo como

 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 } } 

He estado enfrentando los mismos problemas hasta que hice algunos cambios en mi código.

Lo que pasó es que yo estaba adjuntando el mismo LocationListener cuando solicita tanto GPS y las actualizaciones de ubicación de red y me estaba recibiendo "extraño" problemas, incluyendo la obtención de actualizaciones de la ubicación WIFI antiguo con la hora actual.

Aquí está mi viejo código:

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

Al parecer, eso es una cosa bastante "insegura" para hacer (lo siento, novato de Android aquí) y así que lo cambié a:

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

Por supuesto, tuve que definir 2 bloque de códigos onLocationChanged separado para manejar los 2 oyentes.

Bien, resolvió mi problema. He probado esto en Gingerbread (API Level: 8). No estoy seguro si funciona para usted.

  • Android - Get Notified cuando se detecta un nuevo punto de acceso?
  • esperar hasta que el wifi esté conectado en android
  • ¿Tiene el emulador de dispositivos Android una dirección MAC?
  • Obtener SSID cuando WIFI está conectado
  • ¿Cómo obtener una notificación cuando un dispositivo se conecta a su android wifi tethering AP?
  • Android 4.0 - comprobar la conexión a WiFi
  • Android: ¿Conectar dos teléfonos inalámbricamente?
  • Notificación de muestra de Android de BroadcastReceiver
  • ¿Qué es diferente de NSD y WifiP2pManager?
  • ¿Puedo obtener la dirección IP del punto de acceso a Estoy conectado a través de wifi?
  • Java.net.SocketException: recvfrom falló: ECONNRESET (Conexión restablecida por pares) Más de WIFI
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.