Android LocationClient.getLastLocation () devuelve la ubicación antigua e inexacta con una nueva marca de tiempo

He estado usando el proveedor de ubicación fusionado desde su lanzamiento y estoy bastante contento con él (mucho mejor que el sistema antiguo). Pero me encontré con un problema peculiar cuando se utiliza geofencing en combinación con LocationClient.lastKnownLocation (). La configuración es la siguiente:

Dejo caer varias geofencias alrededor de un lugar de origen (con rangos cada vez mayores). Cuando obtengo la intención de que una valla se cruza, recupero la última ubicación conocida de LocationClient y trabajo con ella. Aparte de que también me registré para las actualizaciones regulares de la ubicación con el modo de actualización PRIORITY_BALANCED_POWER_ACCURACY.

La mayoría de las veces esto funciona perfectamente bien, pero a veces esto sucede:

Tiempo 000 s – (Lat, Lon, Exactitud) = (48,12316,11,5855167,683,0)

Tiempo 120 s – (Lat, Lon, Exactitud) = (48,1260497,11,5731745,31,823)

Tiempo 300 s – (Lat, Lon, Exactitud) = (48,1217455,11,5641666,143,81)

Tiempo 420 s – (Lat, Lon, Exactitud) = (48.1189942,11.559061,36.0)

Tiempo 600s – (Lat, Lon, Exactitud) = (48,12316,11,5855167,683.0)

Observe que todas estas ubicaciones son recuperadas por getLastKnownLocation () . Lo que parece sospechoso aquí es que la primera y la última ubicación son idénticas (incluso en los otros atributos), para ser más específico:

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

No entiendo cómo esto puede suceder, pues ha habido localizaciones en medio que eran más recientes y más exactos. También la nueva marca de tiempo en una antigua ubicación me hace curioso … aparentemente cosas similares sucedieron cuando se utiliza la API de edad , pero este nuevo proveedor de ubicación se llama simplemente fused , por lo que no puedo distinguir GPS de WPS de sensores … Si es El problema de conmutación de torre de celda (descrito en la pregunta relacionada con el API antiguo) entonces ¿por qué el teléfono se conectaría a una torre "lejana" si hubiera visto torres más cercanas?

¿Por qué está pasando esto?

El primero y el último punto se obtuvieron utilizando la triangulación celular. El error / precisión es típico de la ubicación basada en celdas, y parece que la lógica de ahorro de energía de Google decidió que el cambio a la celda estaría bien, incluso si usted dice que su historia reciente incluía puntos mucho más cerca.

¡Oh, MUCHAS! Tengo esto también hoy … Y me mudé a la nueva ubicación de Google Play Services precisamente para evitar esto … Y yo estaba tan emocionado hasta ahora cuando lo conseguí también. Usted puede o no puede saber que el viejo tuvo este tipo de problemas, y fue un dolor.

Hay un montón de temas en relación con esto, incluyendo uno de mis propios 🙁

¿Por qué locationmanager devuelve viejas correcciones de ubicación con new gettime-timestamp?

Supongo que lo único que hay que hacer es evitar usar la ubicación en caché …

En lugar de sondear, se puede trabajar alrededor de una o más fuentes de inexactitud utilizando este mecanismo de suscripción.

 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)); 
  • ¿Cómo obtener la posición GPS actual sin esperar cambios de ubicación en Android?
  • Recibir una notificación (vía BroadcastReceiver) cuando se inicia / detiene el GPS (o servicios de ubicación)
  • Android: compruebe si los servicios de ubicación están habilitados utilizando el proveedor de ubicación fusionado
  • Obtener la dirección de ubicación actual de la aplicación de Android
  • Detectar o impedir si el usuario utiliza una ubicación falsa
  • Problemas con android.location.geocoder
  • Error invocar método virtual 'doble android.location.Location.getLatitude ()' en una referencia de objeto nulo
  • Cómo publicar datos utilizando el método POST en Android
  • ZipCode desde la ubicación
  • Calcule el rumbo de la brújula / rumbo a la ubicación en Android
  • Convertir la ubicación en GeoPoint
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.