Есть ли способ обнаружить, когда пользователь изменил время на своем устройстве?

Есть ли способ обнаружить, когда системные часы Android были сброшены пользователем в Android?

Я разрабатываю приложение, которое использует системное время, чтобы определить, когда пользователь находится в определенном месте в определенное время, и я не хочу полагаться на доступность сети в этот момент. Очевидно, поэтому было бы полезно знать, когда пользователь изменил системные часы, поэтому они не могут «обманывать».

Да, есть. ACTION_TIME_CHANGED Intent транслируется, когда время устройства изменяется, и вы можете иметь метод, который будет срабатывать при обнаружении этого намерения.

Это намерение было в Android с уровня API 1, поэтому оно должно работать на любой платформе, с которой вам может потребоваться совместимость.

Вам нужно будет обработать трансляцию с помощью BroadcastReceiver :

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

Вам также нужно добавить что-то подобное вашему манифесту:

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

Это позволит Android узнать, как запустить ваш приемник, когда обнаружен этот тип намерений.

Кажется, что это не важно, кто редактирует время, но также не запускает автоматическую настройку, когда вы синхронизированы с сетью. Если вы потеряете сеть и восстановите ее, это, скорее всего, будет сработано, так как ваше время будет немного отличаться (при условии, что вы используете автоматическое сетевое время).

Однако, хотя часы на сотовых телефонах не особенно точны (поскольку они обычно полагаются на синхронизацию с сигналами времени, которые они получают), по моему опыту они абсолютно не должны терять больше чем 30 секунд или минуту в час при абсолютном максимуме, поэтому Если изменение времени невелико, вы можете предположить, что оно было автоматическим. Скоростные секунды, когда они добавляются, также, вероятно, будут давать сообщение о смене времени, хотя они, очевидно, небольшие и нечастые.

Вы можете использовать ConnectivityManager для отслеживания того, имеет ли телефон соединение или нет, и вы можете изменить поведение на основе этого (то есть до тех пор, пока есть сетевое подключение, а время – автоматическое / сетевое время, игнорирование изменений времени или что-то еще) Но я не могу найти никаких намерений в отношении потери / восстановления сетевого подключения, поэтому вам, вероятно, придется использовать метод опроса.

Небольшое уведомление о ответе matt5784: я узнал, что на Android 4.1.2 действие намерения недоступно, не знаю, действительно ли это для всех версий Android или просто у меня. Вместо

  "android.intent.action.ACTION_TIME_CHANGED" 

использование

  "android.intent.action.TIME_SET" 

Системное время ( System.currentTimeMillis() ) изменилось бы, если пользователь отрегулировал часы, но прошедшее время с момента загрузки ( SystemClock.elapsedRealtime() ), надеюсь, не будет. Отслеживая разницу между этими двумя, можно было бы обнаружить значительные изменения в системных часах пользователем.

Было бы важно не отслеживать небольшие изменения, которые могут быть вызваны обновлением системы системными часами. Я собираюсь предположить, что для моих целей любое изменение менее чем через полчаса не имеет значения; Системное время не должно меняться в Locale страны Locale но это также может быть оправдано.

Истекшее реальное время, очевидно, будет сброшено при загрузке, поэтому я должен включить BroadcastReceiver для сброса дифференциала при получении android.intent.action.BOOT_COMPLETED .

Если вы не возражаете против того, чтобы ваше приложение бросало читы в случае, если часы пользователя будут обновляться из-за сдвигов * DT / * ST, случайное время синхронизируется с источниками NTP, которые могут перематывать ваши часы, застопоривание вашего собственного процесса, вы можете реализовать " Косвенную "проверку системного времени, чтобы, если время прошло« назад », вы предполагаете, что это« чит ». В противном случае вы должны полагаться на сервер, который будет вашим источником «действительного» времени. И даже тогда время вашего сервера может слишком часто возвращаться назад.