android - puedo - porque se desconfigura la hora de mi celular
¿Hay alguna forma de detectar cuándo el usuario ha cambiado la hora del reloj en su dispositivo? (5)
La hora del sistema ( System.currentTimeMillis()
) cambiaría si el usuario ajustara el reloj, pero el tiempo transcurrido desde el arranque ( SystemClock.elapsedRealtime()
) no lo haría. Al rastrear el diferencial entre estos dos, sería posible detectar cambios importantes en el reloj del sistema por parte del usuario.
Sería importante no rastrear pequeños cambios que podrían ser causados por la red actualizando el reloj del sistema. Voy a suponer que, para mi propósito, cualquier cambio en menos de media hora es irrelevante; la hora del sistema no debería cambiar en el país de Locale
pero también podría valer la pena eliminarla.
El tiempo real transcurrido obviamente se restablecería al arrancar, así que debería incluir un BroadcastReceiver
para restablecer el diferencial al recibir android.intent.action.BOOT_COMPLETED
.
¿Hay alguna manera de detectar cuándo el usuario ha reiniciado el reloj del sistema Android en Android?
Estoy diseñando una aplicación que utiliza el tiempo del sistema para determinar cuándo un usuario se encuentra en un lugar determinado en un momento determinado, y no quiero depender de la disponibilidad de la red en ese momento. Obviamente, sería bueno saber cuándo el usuario ha cambiado el reloj del sistema, por lo que no pueden "engañar".
Podemos usar tanto TIME_SET
como TIMEZONE_CHANGED
.
<application
...>
<receiver android:name=".TimeChangedReceiver">
<intent-filter>
<action android:name="android.intent.action.TIME_SET"/>
<action android:name="android.intent.action.TIMEZONE_CHANGED"/>
</intent-filter>
</receiver>
</application>
TimeChangedReceiver.java
public class TimeChangedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "time change " + intent.getAction(), Toast.LENGTH_SHORT).show();
}
}
Si no le importa que su aplicación arroje trampas en caso de que el reloj del usuario se actualice debido a los cambios * DT / * ST, el tiempo ocasional se sincroniza con fuentes NTP que pueden rebobinar su reloj, puede detener su propio proceso, puede implementar un " consecuencial "verificar el tiempo del sistema para que, si el tiempo se" vuelve ", suponga que es un" truco ". De lo contrario, debe confiar en el servidor que será su fuente de tiempo "válido". E incluso entonces, el tiempo de su servidor también puede retroceder ocasionalmente.
Un pequeño aviso a la respuesta de matt5784: descubrí que en Android 4.1.2 la acción intencionada no está disponible, no sé si esto es para todas las versiones de Android o solo para las mías. En lugar de
"android.intent.action.ACTION_TIME_CHANGED"
utilizar
"android.intent.action.TIME_SET"
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 esta intención.
Esta intención ha estado en Android desde el nivel 1 de la API, por lo que debería funcionar en cualquier plataforma con la que necesites ser compatible.
Tendrá que manejar el Broadcast con un BroadcastReceiver
:
public class TimeChangedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Do whatever you need to
}
}
También deberá agregar algo como esto a su Manifiesto:
<receiver android:name=".TimeChangedReceiver">
<intent-filter>
<action android:name="android.intent.action.TIME_SET" />
</intent-filter>
</receiver>
Esto permitirá que Android sepa activar su receptor cuando se detecte este tipo de intención.
Parece que no importa quién edita el tiempo, sino que tampoco se activa en los ajustes automáticos cuando se sincroniza con la red. Sin embargo, si pierde la red y la recupera, es probable que se active ya que su tiempo será ligeramente diferente (suponiendo que esté utilizando el tiempo de red automático).
Sin embargo, aunque los relojes de los teléfonos celulares no son particularmente precisos (ya que generalmente dependen de la sincronización con las señales horarias que reciben), en mi experiencia no deberían perder más de 30 segundos o un minuto por hora, al máximo absoluto, por lo que si el cambio de tiempo es pequeño, quizás pueda asumir que fue automático. Los segundos intercalares, cuando se agregan, también producirán un mensaje de cambio de tiempo, aunque estos son obviamente pequeños e infrecuentes.
Puede usar ConnectivityManager
para realizar un seguimiento de si el teléfono tiene una conexión o no y puede cambiar el comportamiento en función de eso (es decir, mientras la conectividad de red esté allí, y la hora sea automática / de red, ignore los cambios de hora o algo así) pero no puedo encontrar ninguna intención de perder / recuperar la conectividad de la red, por lo que probablemente tendrá que usar un método de votación.