2010-12-11 6 views
6

Mi aplicación utiliza LocationListener para realizar un seguimiento de la ubicación actual. Siempre que el proveedor de GPS proporcione correcciones regulares, esto funciona bien. Sin embargo, quiero que mi aplicación avise al usuario si la ubicación ya no es confiable porque la solución ya no está actualizada. Por lo tanto, he usado un timeCheckHandler para llamar a getLastKnownLocation cada pocos segundos.Problema de Android para descubrir cómo la última corrección de GPS reciente es

Mi problema es que incluso cuando se reciben correcciones con frecuencia el tiempo devuelto al aplicar getTime() a la ubicación devuelta por getLastKnownLocation es generalmente anterior al tiempo actual devuelto por System.currentTimeMillis(), a menudo por unos 20 segundos .

He investigado más el problema añadiendo código a onLocationChanged (arg0) para registrar la hora de la corrección (arg0.getTime()) y la hora actual (System.currentTimeMillis()). Nuevamente veo una diferencia de aproximadamente 20 segundos.

El código lee actualmente de la siguiente manera:

public void onLocationChanged(Location arg0) { 
    mapview.handleLocationChanged(mapview, arg0.getLatitude(), arg0.getLongitude(), arg0.getBearing(), arg0.getAccuracy(), "GPS fix"); 
    addDebugNote("Fix received at time: "+Long.toString(arg0.getTime()/1000)+" Now: "+Long.toString((System.currentTimeMillis())/1000)); 
} 

y típico de salida a mi archivo de depuración se lee:

Fix received at time: 1292091908 Now: 1292091928 

¿Por qué debería estar viendo la diferencia entre el tiempo de corrección y la hora actual del sistema ?

¿Tengo que aceptar que una diferencia de alrededor de 20 segundos es normal?

+0

Tuve el mismo problema y agregué: 'arg0.setTime (System.currentTimeMillis()); 'como primera línea en el método' onLocationChanged (Location arg0) 'para" corregir "la marca de tiempo. No estoy seguro de si esto creará algún efecto secundario más adelante – ApollonDigital

Respuesta

20

La hora de ubicación del GPS viene independientemente del tiempo de su proveedor/hora del dispositivo. System.currentTimeMillis() le dará la hora del dispositivo configurada en su dispositivo.

Si usted quiere saber lo reciente de la cuestión es que puede:

  1. Sincronizar tanto los tiempos (GPS y dispositivos) en el código al inicio de la aplicación mediante la adopción de la diferencia entre ambos, tan pronto como se obtiene primera actualización de ubicación GPS. En ese instante consulte el tiempo del dispositivo y vea cuál es la diferencia en ambos. Guarde esta diferencia en la variable.

  2. Utilice esto como un factor de corrección en las actualizaciones de ubicación posteriores para saber la hora exacta en función del marco de referencia que necesita. (Hora del dispositivo o GPS)

También encontré que al utilizar NETWORK como proveedor de ubicación, puede obtener solo el dispositivo. Por lo tanto, si está escuchando actualizaciones de ambos (GPS y red), también puede necesitar distinguir esto usando location_obj.getProvider() y filtrar el proveedor de GPS.

+1

Gracias. Esto es muy útil. (Imagino que el tiempo del GPS debe ser muy preciso para que funcione con tanta precisión. Me pregunto por qué las redes telefónicas simplemente no se sincronizan con él.) – prepbgg

+0

buen punto, ¿tal vez es más probable que la red esté activada que gps? De cualquier manera, si su teléfono sincroniza el tiempo con el GPS, ¿no nos encontraríamos con un tiempo de red desactivado cuando tratamos de obtener tiempo()? así que básicamente tendríamos que usar temporizadores Sunc cuando usamos la red para actualizaciones de ubicación –

1

Repitiendo la prueba hoy He encontrado que la diferencia entre la hora del GPS y la hora del sistema es de 22 segundos. Este problema se trata en otro lugar de la web y parece que es normal que exista una diferencia entre la hora del GPS y la hora del sistema del teléfono (que en mi caso se configura para que se actualice automáticamente desde la red). Un factor es que el GPS el tiempo es de aproximadamente 15 o 17 segundos (dependiendo de la fuente que sea correcta) a partir de la hora UTC ... no está sincronizado porque el tiempo GPS no se ha actualizado desde 1980 para los "segundos intercalares" periódicos.

Teniendo esto en cuenta, creo que la respuesta a mi necesidad de comprobar cuán actual es la última solución será comparar la hora actual del sistema con la hora del sistema (no la hora del GPS) de la última corrección.

+0

Volver a leer la referencia de Android para la ubicación Me recuerda que getTime() devuelve la hora UTC de la corrección, y supongo que puedo confiar en que esta sea precisa. Por lo tanto, debe ser el tiempo del sistema del teléfono que es inexacto. Leyendo más en Internet veo que es habitual que los relojes de los teléfonos se salgan de la sincronización por muchos segundos. – prepbgg

Cuestiones relacionadas