Чтение вывода "ls / datadata" в цикле - PullRequest
2 голосов
/ 05 сентября 2011

Я занимаюсь разработкой небольшого приложения, которое должно читать содержимое защищенной папки, поэтому я пришел к выводу, что мне пришлось использовать su в сочетании с ls и inputsream.

Однако, когда функция readLine достигает конца вывода, она просто зависает. Я предполагаю, что это потому, что в последней строке нет знака EOL ...

Код:

 p = Runtime.getRuntime().exec("su");
 outputS = new DataOutputStream(p.getOutputStream()); 
 inputS = new DataInputStream(p.getInputStream());
 errorS = new DataInputStream(p.getErrorStream());


 outputS.writeBytes("ls /datadata" + "\n");
 outputS.flush();

 while((s = inputS.readLine()) != null)
 {
      Log.i("DS", s);
 }
 Log.i("DS", "done");

Как я могу обойти это? Я попытался прочитать символы, а затем просто ждать -1, но это не сработало, то же самое, что и выше. В идеале я бы делал это без системных вызовов, но Android, к сожалению, не позволяет мне перечислять или копировать содержимое этой папки ...

Спасибо, что прочитали это, Квинт

РЕДАКТИРОВАТЬ: Благодаря приведенному ниже ответу я решил свою проблему, что бы вы ни делали, просто убедитесь, что вы завершили задачу "su" так же, как и при использовании оболочки adb. Вы можете использовать метод, описанный в принятом ответе, или вручную запустить «выход» после того, как вы сделали все, что вам нужно было сделать. Запуск exit генерирует две пустые строки в потоке ошибок по неизвестным мне причинам.

1 Ответ

1 голос
/ 05 сентября 2011

su все еще ожидает выполнения других команд

Вы можете указать su выполнить только одну команду и выйти. Изменение

p = Runtime.getRuntime().exec("su");

до

p = Runtime.getRuntime().exec(new String[]{"su", "-c", "ls /datadata"});

и удалите outputS... строки

...