Existe-t-il un moyen de détecter quand l'utilisateur a changé l'heure de l'horloge sur son appareil?

Existe-t-il un moyen de détecter quand l'horloge système Android a été réinitialisée par l'utilisateur dans Android?

Je concevais une application qui utilise l'heure du système pour déterminer quand un utilisateur se trouve à un certain endroit à un certain moment, et je ne veux pas compter sur la disponibilité du réseau à ce moment-là. De toute évidence, il serait bon de savoir quand l'utilisateur a changé l'horloge système, de sorte qu'ils ne peuvent pas «tricher».

4 Solutions collect form web for “Existe-t-il un moyen de détecter quand l'utilisateur a changé l'heure de l'horloge sur son appareil?”

Oui il y a. L' ACTION_TIME_CHANGED Intent est diffusé lorsque l'heure de l'appareil est modifiée et vous pouvez disposer d'une méthode qui déclenchera lorsque cette intention sera détectée.

Cette intention a été dans Android depuis API niveau 1, donc il devrait fonctionner sur n'importe quelle plate-forme dont vous devrez peut-être être compatible.

Vous devrez gérer la diffusion avec BroadcastReceiver :

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

Vous devrez également ajouter quelque chose comme ceci à votre Manifeste:

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

Cela permettra à Android de savoir déclencher votre récepteur lorsque ce type d'intention est détecté.

Il semble que cela ne se soucie pas de savoir qui édite l'heure, mais ne déclenche pas non plus les réglages automatiques lorsque vous êtes synchronisé avec le réseau. Si vous perdez le réseau et le récupérez, cela risque de provoquer un déclenchement puisque votre temps sera légèrement différent (en supposant que vous utilisez le temps de réseau automatique).

Cependant, alors que les horloges sur les téléphones cellulaires ne sont pas particulièrement précises (car elles dépendent généralement de la synchronisation avec les signaux horaires qu'ils reçoivent), je ne devrais absolument pas perdre plus de 30 secondes ou une minute par heure au maximum absolu. Si le changement de temps est petit, vous pouvez peut-être supposer qu'il soit automatique. Les secondes de saut, lorsqu'elles sont ajoutées, produiront vraisemblablement un message de changement d'heure, même si ces dernières sont évidemment peu fréquentes.

Vous pouvez utiliser ConnectivityManager pour vérifier si le téléphone a une connexion ou non et vous pouvez modifier le comportement en fonction de cela (c'est-à-dire tant que la connectivité réseau est là, et l'heure est automatique / temps réseau, ignorez les changements de temps ou quelque chose) Mais je ne peux pas trouver d'intentions concernant la perte / reprise de la connectivité réseau, donc vous devrez probablement utiliser une méthode d'interrogation.

Un petit préavis sur la réponse de matt5784: j'ai découvert que sur Android 4.1.2 l'action intentionnelle n'est pas disponible, ne sais pas si cela est pour toutes les versions d'Android ou juste à la mienne. Au lieu de

  "android.intent.action.ACTION_TIME_CHANGED" 

utilisation

  "android.intent.action.TIME_SET" 

L'heure du système ( System.currentTimeMillis() ) changerait si l'utilisateur a ajusté l'horloge, mais le temps écoulé depuis le démarrage ( SystemClock.elapsedRealtime() ) n'aurait pas été possible. En parcourant le différentiel entre ces deux, il serait possible de détecter les changements majeurs de l'horloge système par l'utilisateur.

Il serait important de ne pas suivre de petits changements qui pourraient être causés par le réseau de mise à jour de l'horloge système. Je vais supposer que, pour mes besoins, tout changement d'environ une demi-heure n'est pas pertinent; L'heure du système ne devrait pas changer sur le changement de pays local, mais cela pourrait valoir la peine d'être éliminé également.

Le temps réel écoulé serait évidemment réinitialisé lors du démarrage, donc je devrais inclure un BroadcastReceiver pour réinitialiser le différentiel lors de la réception de android.intent.action.BOOT_COMPLETED .

Si vous ne craignez pas que votre application lance des trucs en cas d'horloge de l'utilisateur, il sera mis à jour en raison des décalages * DT / * ST, le temps occasionnel se synchronise avec les sources NTP qui peuvent rebobiner votre horloge, la stérilisation de votre propre processus, vous pouvez implémenter un " Conséquence "vérifier l'heure du système afin que, si le temps allait" en arrière ", vous supposez que c'est une« triche ». Sinon, vous devez compter sur le serveur qui sera votre source d'heure "valide". Et même alors, le temps de votre serveur peut également aller en arrière de temps en temps.

coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.