Как установить мобильное системное время и дату в Android?

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

6 ответов

Вы не можете использовать обычную телефонную трубку с полки, потому что невозможно получить разрешение SET_TIME. Это разрешение имеет уровень защиты signatureOrSystem поэтому рыночное приложение не может изменить глобальное системное время (но, возможно, с помощью черной магии vodoo я пока не знаю).

Вы не можете использовать другие подходы, потому что это предотвращено на уровне Linux (см. Длинный ответ ниже) - вот почему все испытания с использованием терминалов и SysExecs потерпят неудачу.

Если вы МОЖЕТЕ получить разрешение либо потому, что вы рутировали свой телефон, либо создали и подписали собственный образ платформы, читайте дальше.

Короткий ответ

Это возможно и было сделано. Тебе нужно android.permission.SET_TIME, После использования AlarmManager с помощью Context.getSystemService(Context.ALARM_SERVICE) и это метод 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 внутренне (что успешно из-за пользователя, диспетчер аварийных сигналов работает как).

~~~ Приветствия

Согласно этой теме, пользовательские приложения не могут устанавливать время независимо от того, какие разрешения мы ему предоставляем. Вместо этого лучший подход - заставить пользователя устанавливать время вручную. Мы будем использовать:

startActivity(new Intent(android.provider.Settings.ACTION_DATE_SETTINGS));

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

Решением для корневых устройств может быть выполнение команд

  • су
  • дата -с ГГГГММДД.ЧЧММСС

Изменить дату на cmd

Вы можете сделать это с помощью кода следующим методом:

private void changeSystemTime(String year,String month,String day,String hour,String minute,String second){
    try {
        Process process = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream());
        String command = "date -s "+year+month+day+"."+hour+minute+second+"\n";
        Log.e("command",command);
        os.writeBytes(command);
        os.flush();
        os.writeBytes("exit\n");
        os.flush();
        process.waitFor();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Просто вызовите предыдущий метод так:

changeSystemTime("2015","04","06","13","09","30");

Я нигде не видел этого в списке, но он работает для меня. Мое устройство имеет root-права, и у меня установлен суперпользователь, но если суперпользователь работает на некорневых устройствах, это может сработать. Я использовал AsyncTask и вызвал следующее:

protected String doInBackground(String... params){
Runtime.getRuntime().exec("su && date -s " + params[0]);}

В нашем случае применения грязный обходной путь был:

Когда пользователь подключен к Интернету, мы получаем Интернет-время (NTP-сервер) и сравниваем разницу (-) времени внутреннего устройства (registederOffsetFromInternetTime). Мы сохраняем его в файле конфигурации пользователя.

Мы используем время devide + registederOffsetFromInternetTime, чтобы определить правильное время обновления для НАШЕГО приложения.

Все процессы GETHOUR проверяют разницу между фактическим временем и временем последнего сравнения (со временем в Интернете). Если время превышает 10 минут, сделайте новое сравнение, чтобы обновить registederOffsetFromInternetTime и сохранить точность.

Если пользователь использует приложение без Интернета, мы можем использовать только registederOffsetFromInternetTime, хранящийся в качестве ссылки, и использовать его. Просто если пользователь изменит время на локальном устройстве в автономном режиме и использует приложение, приложение будет считать неправильное время. Но когда пользователь возвращается к интернету, мы предупреждаем его об изменении часов, просим повторно синхронизировать все или отменить обновления, сделанные в автономном режиме с неправильным часом.

Спасибо пенкин В quickshortcutmaker я точно улавливаю название установки даты / времени. Итак, чтобы начать настройку системного времени:

Intent intent=new Intent();
intent.setComponent(new ComponentName("com.android.settings",
         "com.android.settings.DateTimeSettingsSetupWizard"));      
startActivity(intent);

`

Другие вопросы по тегам