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

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

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

4b9b3361

Ответ 1

Вы не можете использовать обычную телефонную pipeку с полки, потому что невозможно получить разрешение SET_TIME. Это разрешение имеет protectionLevel из 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 внутренне (что успешно из-за пользователя, от имени которого работает диспетчер аварий).

ура

Ответ 2

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

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

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

Ответ 3

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

  • су
  • date -s YYYYMMDD.HHMMSS

Change date on 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");

Ответ 4

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

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

Ответ 5

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

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

Мы используем время devide + registederOffsetFromInternetTime, чтобы рассмотреть правильное обновленное время для нашего приложения.

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

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

Ответ 6

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

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

`