¿Hay una manera de detectar cuando el usuario ha cambiado la hora del reloj en su dispositivo?

¿Hay alguna forma de detectar cuándo el reloj del sistema Android ha sido restablecido por el usuario en Android?

Estoy diseñando una aplicación que utiliza el tiempo del sistema para determinar cuándo un usuario está en un determinado lugar en un momento determinado, y no quiero confiar en la disponibilidad de la red en ese momento. Obviamente, sería bueno saber cuándo el usuario ha cambiado el reloj del sistema, para que no puedan "engañar".

Sí hay. La intención ACTION_TIME_CHANGED se transmite cuando se cambia la hora del dispositivo y puede tener un método que se activará cuando se detecte este intento.

Esta intención ha sido en Android desde API nivel 1, por lo que debería funcionar en cualquier plataforma que pueda necesitar para ser compatible con.

Tendrá que manejar la emisión con un BroadcastReceiver :

 public class TimeChangedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Do whatever you need to } } 

También necesitarás agregar algo como esto a tu Manifiesto:

 <receiver android:name=".TimeChangedReceiver"> <intent-filter> <action android:name="android.intent.action.TIME_SET" /> </intent-filter> </receiver> 

Esto permitirá que Android sepa para activar su receptor cuando se detecta este tipo de intención.

Parece como si esto no importa quién edita el tiempo, pero también no se activa en los ajustes automáticos cuando se sincroniza con la red. Si pierdes la red y la recuperas, sin embargo, esto probablemente disparará, ya que tu tiempo será ligeramente diferente (suponiendo que estés usando el tiempo automático de la red).

Sin embargo, mientras que los relojes en los teléfonos celulares no son particularmente precisos (ya que generalmente se basan en la sincronización con las señales de tiempo que reciben) en mi experiencia que absolutamente no debe perder más de unos 30 segundos o un minuto por hora, al máximo absoluto, por lo que Si el cambio de tiempo es pequeño usted puede quizás asumir que era automático. Los segundos de salto, cuando se añaden, probablemente también producirán un mensaje de cambio de tiempo, aunque éstos son obviamente pequeños e infrecuentes.

Puede utilizar ConnectivityManager para realizar un seguimiento de si el teléfono tiene una conexión o no y puede cambiar el comportamiento basado en eso (es decir, siempre y cuando la conectividad de red está allí, y el tiempo es automático / tiempo de red, ignorar los cambios de tiempo o algo) Pero no puedo encontrar ninguna intención con respecto a perder / recuperar la conectividad de red, así que probablemente tendrá que usar un método de sondeo.

Un pequeño aviso a la respuesta de matt5784: Me enteré de que en Android 4.1.2 la intención de acción no está disponible, no sé si esto es para todas las versiones de Android o simplemente en la mía. En lugar de

  "android.intent.action.ACTION_TIME_CHANGED" 

utilizar

  "android.intent.action.TIME_SET" 

La hora del sistema ( System.currentTimeMillis() ) cambiaría si el usuario ajustara el reloj, pero el tiempo transcurrido desde el arranque ( SystemClock.elapsedRealtime() ) esperaba que no. Mediante el seguimiento de la diferencia entre estos dos, sería posible detectar cambios importantes en el reloj del sistema por parte del usuario.

Sería importante no rastrear los pequeños cambios que podrían ser causados ​​por la red que actualiza el reloj del sistema. Voy a suponer que para mis propósitos, cualquier cambio en menos de media hora es irrelevante; La hora del sistema no debe cambiar en el país de la región cambia, pero que podría valer la pena eliminar también.

El tiempo real transcurrido obviamente se restablecería en el arranque, por lo que debería incluir un BroadcastReceiver para restablecer el diferencial al recibir android.intent.action.BOOT_COMPLETED .

Si no te importa su aplicación para lanzar trucos en caso de que el reloj del usuario se actualizará debido a cambios de * DT / * ST, el tiempo ocasional se sincroniza con fuentes NTP que pueden rebobinar el reloj, el estancamiento de su propio proceso, Consecuencial "en tiempo del sistema de modo que si el tiempo fue" detrás "usted asume que es un" tramposo ". De lo contrario, usted tiene que confiar en el servidor que será su fuente de tiempo "válido". E incluso entonces, el tiempo del servidor puede ir hacia atrás ocasionalmente.

  • Cómo convertir los segundos en este formato "HH: mm: ss"
  • Android días restantes
  • Compruebe si la hora actual es más de una hora desde el tiempo "last_updated"
  • Android java.util.concurrent.TimeUnit Convierta milisegundos a minutos
  • GPS: Cómo funciona la inyección de tiempo NTP
  • Obtener la hora del sistema en milisegundos en android
  • Por qué funciónMillis () devuelve -1 en java
  • Cómo cambiar el tiempo del simulador Android interno
  • Formato de fecha y hora, en milisegundos, con cadena local en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.