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)); 
  • Uso de TelephonyManager para obtener SIM CÓDIGO DE PAÍS - ¿Cómo?
  • Uso del sensor de orientación para apuntar hacia una ubicación específica
  • Compruebe si el usuario ha activado GPS después de
  • Cómo comprobar la ubicación de Mock en Android Marshmallow?
  • Android mejor manera de obtener la ubicación actual
  • ¿Dónde está la ubicación .apk para las aplicaciones que se instalan en sdcard?
  • ACCESS_FINE_LOCATION Permisos de AndroidManifest no concedidos
  • ¿Cómo acceder al cambio de ubicación en segundo plano para Google Maps android API v2?
  • Obtener la ubicación de Android a través de wifi no funciona
  • Cómo recuperar la ubicación GPS a través de SMS
  • Android obtener la ubicación del mejor proveedor disponible
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.