Ответ 1
Прежде всего, я разработчик ClockSync, и я кое-что знаю об установке времени на Android.
Я боюсь, что ответ, представленный Фиолетовым Жирафом, неверен. Проблема в том, что обычное пользовательское приложение не может получить доступ к разрешению SET_TIME. Это разрешение может использоваться только системными приложениями, которые установлены как часть ПЗУ или подписаны с тем же ключом, что и сам ПЗУ (зависит от поставщика). Одним из приложений, использующих этот подход, является NTPc. Он подписан с ключом AOSP и может быть установлен на Android-устройства на базе AOSP, такие как CyanogenMod. Обратите внимание, что Google недавно запретил ключи AOSP от Market, и автор никогда не сможет обновить свое приложение. NTPc не может быть установлен на обычных ПЗУ, используемых на большинстве телефонов.
Если вам нужны подробности, обязательно прочитайте комментарии для знаменитой проблемы 4581: Разрешить приложениям пользователей устанавливать систему время. Обратите внимание, что проблема была Отклонено от Google со следующим комментарием:
Привет, это по дизайну, что приложения не могут изменить время. Там много тонких аспектов безопасности, которые могут опираться на текущее время, например, истечение срока действия сертификата, управление лицензиями и т.д. Мы не хотят разрешить сторонним приложениям глобально нарушать систему таким образом.
Как установить время на корневом устройстве:
Что ClockSync делает, чтобы установить время, изменяя разрешение устройства /dev/alarm
. По существу, он запускает chmod 666 /dev/alarm
в корневой оболочке. Если у этого устройства есть права на запись для всех пользователей, SystemClock.
Sytrant.
По умолчанию ClockSync устанавливает разрешение 666, только если /dev/alarm
уже не доступен для записи. Это экономит процессор/батарею, поскольку выполнение su/Superuser.apk относительно дорого. Если вы беспокоитесь о безопасности, есть опция Восстановить разрешение, которая сделает разрешение 664 устройства тревоги после установки времени.
Для упрощения доступа к корневой оболочке из приложения я использую свой собственный класс-помощник: ShellInterface. Другой вариант - использовать библиотеку RootTools.
Вот пример кода на основе ShellInterface class:
public void setTime(long time) {
if (ShellInterface.isSuAvailable()) {
ShellInterface.runCommand("chmod 666 /dev/alarm");
SystemClock.setCurrentTimeMillis(time);
ShellInterface.runCommand("chmod 664 /dev/alarm");
}
}
Не забудьте проверить другие проблемы с Android, связанные с временем установки:
- Проблема 12497: способность приложений получать разрешение на установление времени
- Выпуск 18681: Внедрение timesync с помощью NTP
- Проблема 67: Автоматическая настройка даты и времени с использованием SIM или NTP
Если вам нужно точное время в приложении без использования root и изменения системного времени, вы можете иметь свои собственные таймеры, например, на основе Joda Time. Вы можете получить время с NTP-серверов с помощью NTP-клиента из библиотеки Apache commons-net.