¿Cómo puedo obtener el tiempo de “red”, (desde la configuración “Automática” llamada “Usar valores proporcionados por la red”), NO la hora en el teléfono?

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

No quiero usar la hora del teléfono porque podría obtener una diferencia de aproximadamente 5 minutos en tiempo real. y 5 minutos extra o menos = 10 minutos!

He escuchado sobre la información del tiempo en los satélites GPS o en las antenas de la red.

Lo he intentado con System.getCurrentTime pero obtengo la actual del dispositivo, por lo tanto, si mi dispositivo está configurado 5 minutos antes, muestra la hora incorrecta.

EDITAR

Para hacer una breve pregunta: ¿cómo puedo obtener esta vez?

enter image description here

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

La pantalla que muestra es DateTimeSettings . La checkbox “Usar valores proporcionados por la red” está asociada a la String KEY_AUTO_TIME = "auto_time"; 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 la red 2 ServiceStateTracker s: GsmServiceStateTracker y CdmaServiceStateTracker .

Ambas implementaciones llaman a un método llamado revertToNitz() cuando la configuración se vuelve verdadera. Aparentemente NITZ es el equivalente de NTP en el mundo de los transportistas.

En revertToNitz() : puede establecer el tiempo al valor proporcionado por el operador gracias a revertToNitz() . Desafortunadamente, no he encontrado un mecanismo para obtener el tiempo de la red. Si realmente necesita hacer esto, me temo que tendrá que copiar las implementaciones de ServiceStateTracker , captar la intención planteada por el marco (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 lo mismo que System.currentTimeMillis ().

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

Puede ver la diferencia después de configurar el tiempo del sistema a 1 hora atrás.

 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 el permiso en Manifest

  

Esto pareció funcionar para mí:

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

Trabajando 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 Layer 3 o NAS. Comúnmente este mensaje se ve como GMM Info y contiene la siguiente información:

Ciertos proveedores no son compatibles con esto y algunos lo admiten y lo configuran incorrectamente.

MENSAJE DE SEÑALIZACIÓN DE LA CAPA 3

Hora: 9: 38: 49.800

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

Discriminador de protocolo M (datos hexadecimales: 8)

 (0x8) Mobility Management message for GPRS services 

M Indicador de omisión (datos hexadecimales: 0) Valor: 0 M Tipo de mensaje (datos hexadecimales: 21) Número de mensaje: 33

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

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

Ahora puede obtener tiempo para la ubicación actual, pero para esto debe establecer la zona horaria predeterminada persistente del sistema. setTimeZone(String timeZone) que se puede obtener desde

 Calendar calendar = Calendar.getInstance(); long now = calendar.getTimeInMillis(); TimeZone current = calendar.getTimeZone(); setAutoTimeEnabled(boolean enabled) 

Establece si la hora del reloj de pared debe o no sincronizarse con las actualizaciones automáticas de hora desde NTP.

 TimeManager timeManager = TimeManager.getInstance(); // Use 24-hour time timeManager.setTimeFormat(TimeManager.FORMAT_24); // Set clock time to noon Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.HOUR_OF_DAY, 12); long timeStamp = calendar.getTimeInMillis(); timeManager.setTime(timeStamp); 

Estaba buscando ese tipo de respuesta. Leí tu respuesta, pero no estaba satisfecha y era un poco vieja. Encontré la nueva solución y la comparto. 🙂

Para obtener más información, visite: https://developer.android.com/things/reference/com/google/android/things/device/TimeManager.html

la señal horaria no está integrada en las antenas de red: debe usar el protocolo NTP para recuperar la hora en un servidor ntp. hay muchos clientes ntp, disponibles como ejecutables o bibliotecas independientes.

la señal gps sí incluye una señal horaria precisa, que está disponible con cualquier “corrección”.

sin embargo, si ni la red ni los gps están disponibles, su única opción es recurrir a la hora del teléfono … su mejor solución sería usar una configuración de todo el sistema para sincronizar automáticamente el tiempo del teléfono con el gps o ntp tiempo, luego siempre use la hora del teléfono.

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