Подтвердить что ты не робот

Установка системного времени телефона ROOTED

В настоящее время я пытаюсь установить системное время Android в программном обеспечении. Да, я знаю, что многие люди пробовали это - и потерпели неудачу, как сейчас.: -)

Но я также знаю, что можно установить системное время Android на телефоны ROOTED. У меня есть testet приложение под названием ClockSync, которое делает exaccty, что.

Итак, я хочу узнать, как установить системное время на устройства ROOTED. Пожалуйста, не говорите, что это невозможно.: -)

До сих пор я пытался установить следующие разрешения:

<uses-permission android:name="android.permission.SET_TIME_ZONE"/>
<uses-permission android:name="android.permission.SET_TIME"/>

И затем в моем коде:

AlarmManager a = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
long current_time_millies = System.currentTimeMillis();
try {
    a.setTime((long)current_time_millies+10000);
} catch (Exception e) {
// Why is this exception thrown?
}

Но я всегда получаю следующее исключение:

java.lang.SecurityException: setTime: ни пользователь 10054, ни текущий процесс не имеет android.permission.SET_TIME.

Я тестирую его на том же устройстве, где ClockSync отлично работает. Итак - что я делаю неправильно? Или лучше: можете ли вы предоставить проверенный код, который работает?

4b9b3361

Ответ 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, связанные с временем установки:


Если вам нужно точное время в приложении без использования root и изменения системного времени, вы можете иметь свои собственные таймеры, например, на основе Joda Time. Вы можете получить время с NTP-серверов с помощью NTP-клиента из библиотеки Apache commons-net.

Ответ 2

вы можете установить системную дату и время на корневое устройство, подобное этому

public void setDate()
    {
        try {
            Process process = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream());
            os.writeBytes("date -s 20120419.024012; \n");
        } catch (Exception e) {
            Log.d(TAG,"error=="+e.toString());
            e.printStackTrace();
        }
    }