Runtime.exec (): перезагрузиться в Android? - PullRequest
16 голосов
/ 30 марта 2011

Я ищу решение, которое можно использовать для перезагрузки корневого устройства.Я знаю, что перезагрузка устройства очень плохой дизайн для пользователя, , как указано здесь , и это не совсем для приложения.Основная цель - перезагрузить телефон во время моих тестов (я работаю в приложении видеочата, и иногда мне нужно перезагрузить компьютер, когда все идет на юг)

Я заметил, что перезагрузка телефона происходит намного быстрее, используя перезагрузку втерминал (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 , это большой и сложный проект:)

Можете ли вы помочь мне с этой проблемой?

Спасибо.

Ответы [ 5 ]

34 голосов
/ 24 апреля 2011

Наконец, после нескольких недель поиска:

Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});
15 голосов
/ 07 апреля 2011

перезагрузка отлично работает в андроиде. вы, вероятно, неправильно выполняете 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) {
                }
        }
1 голос
/ 17 июля 2014

Этот код работает на 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;}
}
1 голос
/ 11 мая 2012

Я обнаружил, что не могу выполнить перезагрузку программно.

Кроме того, я могу открыть окно терминала на моем телефоне Android с помощью приложения Terminal Emulator, введите su, чтобы получить приглашение # для получения root-доступа, а затем введите "#reboot "и я получаю ответ" не разрешено! "

Есть какие-нибудь предложения?

ОК, не бери в голову, я понял это.На телефонах HTC команда перезагрузки не будет работать даже с корневым доступом SU.Необходимо выполнить BUSYBOX для выполнения команды перезагрузки.

0 голосов
/ 11 августа 2016

После долгой борьбы я нашел рабочее решение.

Если в вашей системе используется последовательный порт, выполните следующую команду:

Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});

если использовать нормальный порт, тогда excure ниже команды

Runtime.getRuntime().exec(new String[]{"/system/xbin/su","-c","reboot now"});

разница составляет всего /bin и /xbin

так можно кодировать, как если первая команда сгенерирует исключение, а затем выполнить вторую.

...