Показать процессы сценария оболочки

#java #android #text #printing

#java #Android #текст #печать

Вопрос:

У меня есть следующий метод для запуска команд оболочки в моих Java-приложениях, и я хочу запустить несколько сценариев, например, тот, который устанавливает разрешения для всех приложений на телефоне пользователя. Я могу без проблем запустить скрипт, используя эту команду execCommand («/ system / xbin / fix_perm»); однако проблема в том, что я хочу просто распечатать то, что делается, как это делает эмулятор терминала. Как я могу взять мой outputstream и распечатать его на экране? Спасибо за любую помощь

 public Boolean execCommand(String command) 
{
    try {
        Runtime rt = Runtime.getRuntime();
        Process process = rt.exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
        os.writeBytes(command   "n");
        os.flush();
        os.writeBytes("exitn");
        os.flush();
        process.waitFor();
    } catch (IOException e) {
        return false;
    } catch (InterruptedException e) {
        return false;
    }
    return true;
}
  

Ответ №1:

Я надеюсь, вы осведомлены о потенциально экстремальных последствиях разрешения пользователю запускать произвольные команды как su и вместо этого укажете на возможное решение.

 public Boolean execCommand(String command) 
{
    try {
        Runtime rt = Runtime.getRuntime();
        Process process = rt.exec("su");

        // capture stdout
        BufferedReader stdout = new BufferedReader(
            new InputStreamReader(process.getInputStream()));
        // capture stderr
        BufferedReader stderr = new BufferedReader(
            new InputStreamReader(process.getErrorStream()));

        DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
        os.writeBytes(command   "n");
        os.flush();

        String line = null;
        StringBuilder cmdOut = new StringBuilder();
        while ((line = stdout.readLine()) != null) {
            cmdOut.append(line);
        }
        stdout.close();
        while ((line = stderr.readLine()) != null) {
            cmdOut.append("[ERROR] ").append(line);
        }
        stderr.close();

        // Show simple dialog
        Toast.makeText(getApplicationContext(), cmdOut.toString(), Toast.LENGTH_LONG).show();

        os.writeBytes("exitn");
        os.flush();

        // consider dropping this, see http://kylecartmell.com/?p=9
        process.waitFor(); 
    } catch (IOException e) {
        return false;
    } catch (InterruptedException e) {
        return false;
    }
    return true;
}
  

Комментарии:

1. выполняет ли System.out.println() что-нибудь полезное на устройстве Android?

2. На самом деле нет (хотя может отображаться в вашей IDE), изменили его, чтобы использовать регистратор Android.

3. ДА… но я думаю, что OP хочет отобразить это на экране устройства.

4. Да, я хочу отобразить это на экране устройства, а не в журнале, я просто хочу показать, что делается, когда я запускаю пару сценариев, в основном то, что делает эмулятор терминала, за вычетом всего кода за эмулятором, я хочу показать процессы только для нескольких сценариев, которые я хочу запустить в своем приложении

5. Обновлено для использования всплывающих уведомлений ( developer.android.com/guide/topics/ui/notifiers/toasts.html )