Как мне прослушать ответ от команды оболочки в android studio? - PullRequest
1 голос
/ 08 января 2020

В эмуляторе терминала android я могу вводить следующие команды:

> su
> echo $(</sys/class/power_supply/battery/charge_rate)

, и в зависимости от того, как телефон заряжается, выход будет «Нет», «Нормальный» или «Турбо». Я хотел бы иметь возможность получить этот вывод и сохранить его в виде строкового значения в моей программе.

Итак, я провел небольшое исследование этого и код, который я пришел в итоге получается следующее:

    String chargeRate = "None";
    try {
        Runtime rt = Runtime.getRuntime();
        Process process = rt.exec("su \"\"echo $(</sys/class/power_supply/battery/charge_rate)");

        BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));

        if ((chargeRate = stdInput.readLine()) == null)
            chargeRate = "None";
    }
    catch (Exception e) {
        // TODO
    }

Это взято из ряда разных ответов, и я не совсем уверен, что с ним не так. Я не могу перешагнуть или пройти эту строку во время отладки:

if ((chargeRate = stdInput.readLine()) == null)

Как только отладчик достигает этой строки, он говорит: «Приложение работает»

1 Ответ

1 голос
/ 08 января 2020

ОБНОВЛЕНИЕ : решение в Невозможно с помощью Runtime.exe c () выполнить команду оболочки "echo" в Android Java код :

Runtime.getRuntime.exec() не выполняет команду оболочки напрямую, он выполняет исполняемый файл с аргументами. "echo" - это встроенная команда оболочки. На самом деле это часть аргумента исполняемого файла sh с параметром - c. Такие команды, как ls, являются актуальными исполняемыми файлами. Вы можете использовать команды type echo и type ls в оболочке adb, чтобы увидеть разницу.

Итак, окончательный код:

String[] cmdline = { "sh", "-c", "echo $..." }; 
Runtime.getRuntime().exec(cmdline);

cat также выполняется изнутри Runtime.exec() без вызова sh

Это также анализируется в https://www.javaworld.com/article/2071275/when-runtime-exec---won-t.html?page=2 в параграфе Предполагается, что команда является исполняемой программой

Код в Выполнять команды оболочки и получать выходные данные в TextView хорошо, хотя он использует команду, которая выполняется непосредственно (ls, см. Обновление выше):

try {
        // Executes the command.
        Process process = Runtime.getRuntime().exec("ls -l");

        // Reads stdout.
        // NOTE: You can write to stdin of the command using
        //       process.getOutputStream().
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream()));

        int read;
        char[] buffer = new char[4096];
        StringBuffer output = new StringBuffer();
        while ((read = reader.read(buffer)) > 0) {
            output.append(buffer, 0, read);
        }
        reader.close();

        // Waits for the command to finish.
        process.waitFor();

        return output.toString();
    } catch (IOException e) {
        throw new RuntimeException(e);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
...