¿Cómo puedo obtener el tiempo de "red" (desde el ajuste "Automático" llamado "Usar valores proporcionados por la red"), NO el tiempo en el teléfono?

Me gustaría en mi aplicación encontrar una forma de sincronizar la fecha y la hora con algo dado por una fuente externa.

No quiero usar el tiempo del teléfono porque podría obtener una diferencia de tal vez 5 minutos en tiempo real. Y 5 minutos extra o menos = 10 minutos!

He oído hablar de la información del tiempo en los satélites GPS o en las antenas de red.

He intentado con System.getCurrentTime pero consigo el actual el del dispositivo, así que, si mi dispositivo se fija 5 minutos más temprano, exhibe la época incorrecta.

EDITAR

Para hacer una breve pregunta: ¿cómo puedo obtener este tiempo?

Introduzca aquí la descripción de la imagen

No lo sabía, pero encontré la pregunta interesante. Así que cavé en el código android … Gracias open-source 🙂

La pantalla que muestra es DateTimeSettings . La casilla de verificación "Usar valores proporcionados por la red" está asociada a la preferencia compartida String KEY_AUTO_TIME = "auto_time"; Y también a Settings.System.AUTO_TIME

Esta configuración es observada por un observado llamado mAutoTimeObserver en el ServiceStateTracker 2 redes: GsmServiceStateTracker y CdmaServiceStateTracker .

Ambas implementaciones llaman a un método llamado revertToNitz() cuando los ajustes se hacen verdaderos. Aparentemente NITZ es el equivalente de NTP en el mundo de la portadora.

Bottom line: Usted puede fijar la hora al valor proporcionado por el portador gracias a revertToNitz() . Lamentablemente, no he encontrado un mecanismo para obtener el tiempo de red. Si realmente necesitas hacer esto, me temo, tendrás que copiar estas implementaciones de ServiceStateTracker , capturar la intención planteada por el framework (supongo), y agregar un getter a mSavedTime .

Obtenga la biblioteca de http://commons.apache.org/net/download_net.cgi

 //NTP server list: http://tf.nist.gov/tf-cgi/servers.cgi public static final String TIME_SERVER = "time-a.nist.gov"; public static long getCurrentNetworkTime() { NTPUDPClient timeClient = new NTPUDPClient(); InetAddress inetAddress = InetAddress.getByName(TIME_SERVER); TimeInfo timeInfo = timeClient.getTime(inetAddress); //long returnTime = timeInfo.getReturnTime(); //local device time long returnTime = timeInfo.getMessage().getTransmitTimeStamp().getTime(); //server time Date time = new Date(returnTime); Log.d(TAG, "Time from " + TIME_SERVER + ": " + time); return returnTime; } 

GetReturnTime () es igual que System.currentTimeMillis ().

Se debe utilizar el método getReceiveTimeStamp () o getTransmitTimeStamp ().

Usted puede ver la diferencia después de ajustar la hora del sistema a hace 1 hora.

 local time : System.currentTimeMillis() timeInfo.getReturnTime() timeInfo.getMessage().getOriginateTimeStamp().getTime() NTP server time : timeInfo.getMessage().getReceiveTimeStamp().getTime() timeInfo.getMessage().getTransmitTimeStamp().getTime() 

Pruebe este fragmento de código:

 String timeSettings = android.provider.Settings.System.getString( this.getContentResolver(), android.provider.Settings.System.AUTO_TIME); if (timeSettings.contentEquals("0")) { android.provider.Settings.System.putString( this.getContentResolver(), android.provider.Settings.System.AUTO_TIME, "1"); } Date now = new Date(System.currentTimeMillis()); Log.d("Date", now.toString()); 

Asegúrese de agregar permiso en Manifest

 <uses-permission android:name="android.permission.WRITE_SETTINGS"/> 

Esto parecía funcionar para mí:

 LocationManager locMan = (LocationManager) activity.getSystemService(activity.LOCATION_SERVICE); long networkTS = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER).getTime(); 

Trabajo en Android 2.2 API (Nivel 8)

NITZ es una forma de NTP y se envía al dispositivo móvil a través de capas de capa 3 o NAS. Comúnmente este mensaje se ve como GMM Info y contiene la siguiente información:

Ciertos operadores no apoyan esto y algunos lo apoyan y lo tienen configurado incorrectamente.

MENSAJE DE SEÑALIZACIÓN DE LA CAPA 3

Tiempo: 9: 38: 49.800

INFORMACIÓN DE GMM 3GPP TS 24.008 ver 12.12.0 Rel. 12 (9.4.19)

M Protocolo Discriminador (hex data: 8)

 (0x8) Mobility Management message for GPRS services 

M Indicador de saltos (hex data: 0) Valor: 0 M Tipo de mensaje (hex data: 21) Número de mensaje: 33

O Horario y zona horaria (datos hexadecimales: 47716070 70831580) Año: 17 Mes: 06 Día: 07 Hora: 07 Minuto: 38 Segundo: 51 Valor de la zona horaria: GMT + 2: 00 O Hora de ahorro de luz de la red (datos hexadecimales: 490100) Valor del horario de verano: Sin ajuste

Datos de la capa 3: 08 21 46 80 47 71 60 70 70 83 15 80 49 01 00

La señal de tiempo no está integrada en las antenas de red: hay que utilizar el protocolo NTP para recuperar el tiempo en un servidor ntp. Hay un montón de clientes ntp, disponibles como ejecutables independientes o bibliotecas.

La señal GPS, de hecho, incluye una señal de tiempo preciso, que está disponible con cualquier "fijar".

Sin embargo, si ni la red, ni los gps están disponibles, su única opción es recurrir en el momento del teléfono … su mejor solución sería utilizar un sistema de ajuste de ancho para sincronizar automáticamente la hora del teléfono a los gps o ntp Tiempo, luego utilice siempre la hora del teléfono.

Tenga en cuenta que la hora del teléfono, si se sincroniza regularmente, no debe diferir mucho del tiempo de gps o ntp. También tenga en cuenta que obligar a un usuario a sincronizar su tiempo puede ser intrusivo, es mejor que pregunte a su usuario si acepta la sincronización. Al fin, ¿estás seguro de que necesitas absolutamente un tiempo que sea preciso?

  • Glide image loading timeout increase
  • No se puede cargar Android Device Monitor
  • android: mostrar la notificación en un momento específico?
  • Android 4.0 org.apache.http.conn.ConnectTimeoutException: Conectarse a ... agotado el tiempo de espera
  • ¿Cómo puedo comprobar si el sistema es de 12 o 24 horas?
  • Android estableció la última hora modificada para el archivo
  • Problema extraño con los tiempos de espera de conexión y Google Volley
  • ¿Cómo obtener la hora actual de Google para Android?
  • Cómo dar formato al tiempo no fecha en Android o Java?
  • Hora del formato de la clase de tiempo de Android
  • Notificación de Android Push (lento)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.