¿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".
- Cómo obtener sellos horarios precisos desde la ubicación GPS de Android
- Tiempo de dev Android vs tiempo de dev de iPhone
- Diferencia horaria entre dos tiempos
- Añadir una cierta cantidad de tiempo a una hora actual y escribirlo
- Fuente confiable de tiempo para el applet JavaCard en SIM
- ¿Cómo hacer que el código se detenga por un par de segundos en android?
- Tiempo de volver a Android
- Cómo encontrar el tiempo es hoy o ayer en android
- Calcular el tiempo entre dos veces Android
- ¿Es Android usando NTP para sincronizar el tiempo?
- Cómo obtener la hora actual de Internet en android
- ¿Qué es T en YYYYMMDDTHHMMSS?
- ¿Cuál es la curva de aprendizaje para Android?
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 acelerar el tiempo de descompresión en Java / Android?
- Cuándo usar acelerómetro o giroscopio en Android