#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 )