2011-09-05 51 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,更正確嗎?所以謝謝你的解釋! –