¿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!
- ¿Cómo se muestra correctamente la posición / duración de un MediaPlayer?
- Crear un NinePatch / NinePatchDrawable en tiempo de ejecución
- ¿Cómo se puede comprobar el permiso en tiempo de ejecución sin lanzar SecurityException?
- Android - los cálculos con el tiempo transcurrido en el cronómetro
- OnRequestPermissionsResult se llama infinitamente
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?
- Cómo obtener el tiempo de computación en NDK
- ¿Cuáles son los valores predeterminados para los tiempos de espera de conexión y socket en DefaultHttpClient en Android?
- Android - Obtener el widget del cronómetro
- Formato de fecha y hora
- Android startService () tarda mucho tiempo en volver al subproceso de interfaz de usuario
- Androide; Msgstr "Se ha agotado el tiempo de envío de claves ..."
- ¿Es posible ver variables en tiempo de ejecución?
- Dibuja línea personalizada entre dos elementos en TableLayout Android
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?
- Parámetros de eventos personalizados de Firebase Analytics
- ¿Qué es el Native Development Kit (NDK) de Android?