Runtime.exec(): перезагрузка в Android?
Я ищу решение, которое можно использовать для перезагрузки корневого устройства. Я знаю, что перезагрузка устройства очень плохой дизайн для пользователя, как указано здесь, и это не совсем для приложения. Основная цель - перезагрузить телефон во время моих тестов (я работаю над приложением для видеочата, а иногда мне нужно перезагружаться, когда все идет на юг)
Я заметил, что перезагрузка телефона намного быстрее при перезагрузке в терминале (например, adb shell
или ConnectBot), чем обычная перезагрузка с помощью ACTION_REBOOT, что я не могу использовать в любом случае.
На данный момент я могу получить привилегии суперпользователя,
Process root = Runtime.getRuntime().exec("su");
Но я не могу выполнить фактическую перезагрузку. Я стараюсь использовать G1 (HTC) и Galaxy S (Samsung) без каких-либо успехов. Я нашел исполняемый файл перезагрузки в /system/bin/reboot
Вот некоторые из моих попыток:
Process reboot = Runtime.getRuntime().exec("/system/bin/reboot");
Process reboot = Runtime.getRuntime().exec("reboot");
Process reboot = Runtime.getRuntime().exec("su reboot");
Я прочитал эту статью о подводных камнях Runtime.exec(), но я думаю, что я не в этом случае.
Как использование ConnectBot позволяет мне делать такое действие, я уверен, что это возможно. Пожалуйста, не говорите мне пойти и посмотреть на код ConnectBot, это большой и сложный проект:)
Вы можете помочь мне с этой проблемой?
Спасибо.
Ответы
Ответ 1
перезагрузка отлично работает в Android. вы, вероятно, не выполняете runtime.exec() правильно.
вам нужно обработать
public static void rebootSU() {
Runtime runtime = Runtime.getRuntime();
Process proc = null;
OutputStreamWriter osw = null;
StringBuilder sbstdOut = new StringBuilder();
StringBuilder sbstdErr = new StringBuilder();
String command="/system/bin/reboot";
try { // Run Script
proc = runtime.exec("su");
osw = new OutputStreamWriter(proc.getOutputStream());
osw.write(command);
osw.flush();
osw.close();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (osw != null) {
try {
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
try {
if (proc != null)
proc.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
sbstdOut.append(ReadBufferedReader(new InputStreamReader(proc
.getInputStream())));
sbstdErr.append(ReadBufferedReader(new InputStreamReader(proc
.getErrorStream())));
if (proc.exitValue() != 0) {
}
}
Ответ 2
Наконец, после недель поиска:
Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});
Ответ 3
Я нахожу, что не могу выполнить перезагрузку программно.
Кроме того, я могу открыть окно терминала на своем телефоне Android с помощью приложения Terminal Emulator,
тип su
получить приглашение # для доступа root
и затем введите "#reboot"
и я получаю ответ "не разрешен!"
Любые предложения?
Хорошо, неважно, я понял это.
На телефонах HTC команда перезагрузки не работает даже с правами доступа SU root.
Необходимо вызвать BUSYBOX для выполнения команды перезагрузки.
Ответ 4
Этот код работает на Samsung Galaxy S2, S4, Sony Xperia S (LTi 26)
public static void rebootDevice()
{
try
{
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("reboot \n");
}
catch (Throwable t) {t.printStackTrace;}
}
Ответ 5
После долгой борьбы я нашел рабочее решение.
Если ваша система использует последовательный порт, выполните следующую команду:
Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});
, если использовать обычный порт, а затем выберите команду
Runtime.getRuntime().exec(new String[]{"/system/xbin/su","-c","reboot now"});
Разница - это только /bin
и /xbin
так что код может выглядеть как если бы первая команда throw исключение, а затем выполнить второй.