Вы не можете получить обычную телефонную трубку с полки, потому что невозможно получить разрешение SET_TIME. Это разрешение имеет protectionLevel из signatureOrSystem
, поэтому рыночное приложение не может изменить глобальное системное время (но, возможно, с помощью магии черного vodoo я пока не знаю).
Вы не можете использовать другие подходы, потому что это запрещено на уровне Linux (см. Длинный ответ ниже) - вот почему все испытания с использованием терминалов и SysExecs потерпят неудачу.
Если вы МОЖЕТЕ получить разрешение либо потому, что вы рутировали свой телефон, либо создали и подписали собственный образ платформы, читайте дальше.
Короткий ответ
Это возможно и было сделано. Вам нужно android.permission.SET_TIME
. Затем используйте AlarmManager
через Context.getSystemService(Context.ALARM_SERVICE)
и метод s setTime()
.
Фрагмент для установки времени на 2010/1/1 12:00:00 из действия или службы:
Calendar c = Calendar.getInstance();
c.set(2010, 1, 1, 12, 00, 00);
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
am.setTime(c.getTimeInMillis());
Если вы хотите изменить часовой пояс, подход должен быть очень похожим (см. android.permission.SET_TIME_ZONE
и setTimeZone
)
Длинный ответ
Как было указано в нескольких потоках, только пользователь system
может изменять системное время. Это только половина истории. SystemClock.setCurrentTimeMillis()
напрямую записывает в /dev/alarm
, который является файлом устройства, принадлежащим system
, не имеющим мировых прав на запись. Другими словами, только процессы, работающие как system
, могут использовать SystemClock
подход. Для этого способа разрешения для Android не имеют значения, здесь не участвует ни один объект, который проверяет правильные разрешения.
Так работает внутреннее предустановленное приложение «Настройки». Он просто запускается под учетной записью system
.
Для всех остальных детей в городе есть диспетчер сигнализации. Это системная служба, запущенная в процессе system_server
под учетной записью пользователя - угадайте, что - system
. Он предоставляет упомянутый метод setTime
, но обеспечивает разрешение SET_TIME
и, в свою очередь, просто вызывает SystemClock.setCurrentTimeMillis
внутренне (что успешно из-за пользователя, от имени которого работает диспетчер аварий).
~~~ Приветствия