2011-09-05 83 views
2

我正在开发一个小型应用程序,它必须读取受保护文件夹的内容,因此我得出结论,我必须将su与ls和inputstream结合使用。在循环中读取“ls/datadata”输出

但是,当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 shell一样。你可以使用接受的答案中描述的方法,或者在你做任何你想做的事情之后手动运行“退出”。运行出口在errorstream中会生成两条空行,原因不明。

回答

1

su仍然在等待更多的命令来执行

你可以告诉su只执行一个命令,并退出。 变化

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

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

并取出outputS...

+0

啊对,所以基本上我只是要求我每次做一些事情,而不是一次时间肃。还有什么工作是添加另一个输出行:“outputS.writeBytes(”exit“+”\ n“);”,我认为当你有许多任务需要su,更正确吗?所以谢谢你的解释! –