Во время выполнения.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");
Я прочитал эту статью о подводных камнях времени выполнения.exec (), но я думаю, что я не в этом дело.
Поскольку использование ConnectBot позволяет мне выполнить такое действие, я почти уверен, что это возможно. Пожалуйста, не говорите мне пойти и посмотреть на код ConnectBot , это большой и сложный проект:)
Можете ли вы помочь мне в этом вопросе ?
Спасибо.
5 ответов:
Перезагрузка отлично работает в 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) { } }
Наконец, после нескольких недель поиска:
Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});
Я обнаружил, что не могу выполнить перезагрузку программно.
Кроме того, я могу открыть окно терминала на своем телефоне android с помощью приложения эмулятор терминала, тип Су получить приглашение # для корневого доступа а затем введите " # перезагрузка" и я получаю ответ "не разрешается!"
Есть предложения?
Ладно, неважно, я все понял. На телефонах HTC команда перезагрузки не будет работать даже с корневым доступом SU. Необходимо вызвать BUSYBOX для выполнения команды перезагрузки.
Этот код работает на 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;} }
После долгой борьбы я нашел рабочее решение.
Если в вашей системе используется последовательный порт, то выполните следующую команду,
Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});Если использовать обычный порт, то выполните следующую команду
Runtime.getRuntime().exec(new String[]{"/system/xbin/su","-c","reboot now"});Разница только
/binи еще/xbinПоэтому можно написать код, как если бы первая команда бросила исключение, а затем выполнила вторую.
Comments