編輯:關於Android編程
最近做android的一個功能就是調用shell命令來進行一些系統級別的操作,比如說是關機開機之類的,現在總結一下具體的用法以及遇到的坑(基於我所用到的,沒用到的我就不說了)
(1)
Runtime.getRuntime().exec("ls");
這是最簡單的一種,你輸入後就能就會執行ls命令,如果要獲得輸出的話可以這樣寫
Process p = Runtime.getRuntime().exec("ls"); String data = null; BufferedReader ie = new BufferedReader(new InputStreamReader(p.getErrorStream())); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String error = null; while ((error = ie.readLine()) != null && !error.equals("null")) { data += error + "\n"; } String line = null; while ((line = in.readLine()) != null && !line.equals("null")) { data += line + "\n"; } Log.v("ls", data);
但是我所要寫的需要通過root權限來執行,比如說重啟的reboot命令,執行這個的話用普通的身份去執行的話是不會成功的,會報permission denyed,那我們如何才能執行呢,大家都知道adb shell吧,一般root過的機子都能夠通過su來獲得管理員權限,但是沒root過的話就不能了,這就需要把機子進行root了。
root後執行如下命令
Process proc = Runtime.getRuntime().exec(new String[]{"su", reboot});
但是!!!!這個命令貌似不是所有的機子都可以用的,反正我就是遇到這樣的坑,從報錯信息中可以看到,su和reboot是連起來執行的,所以會解析成su reboot,這樣的話會產生一個問題,su 加上 reboot後reboot會被解析成su的命令參數,我們打一下su -help可以看到su的所有參數,明顯可以看出reboot不能直接跟在su後面,所以後來我發現一種可以運行的命令如下:
Process proc = Runtime.getRuntime().exec(su -c reboot);
(3)
但當我們遇到這樣的需求呢!要求運行的shell命令如下
Process proc = Runtime.getRuntime().exec(su -c "ls /data");經過測試,雖然這段代碼中的命令在adb shell中能夠完美運行,但是放到android的java程序中就跪了。。。在android程序中貌似會把/data"當做su的一段參數導致命令一直執行錯誤,無奈,搞了好久能沒能搞出來,於是就改變了實現方法,用第四種方法去實現了。
(4)
第四種方法也是無奈之舉,大家誰有更好的建議歡迎提出。
這種方法就是將所要執行的命令寫成一個shell腳本,然後,在程序中調用這個shell腳本,
我把命令寫成shell腳本放在了手機的目錄中,然後按如下方式調用就成功了。
Process proc = Runtime.getRuntime().exec("su -s sh -c /data/initcommand.sh");
注意,這裡面有和上面相同的問題,如果不加裡面的-c參數的話還是會把後面的文件當做su的參數,當然-c也可以改成-s,這樣就能執行initcommand.sh腳本了,如果不行試試將腳本改成777權限。
程序員很多,遍地都是,高手也很多,但是懂設計的程序員並不多,我覺得我們不僅要成為一個coder還要成為一個designer。我是一個比較注重ued的人,如果對一個app來
在之前的博文《Android 中使用 ViewPager實現屏幕頁面切換和頁面輪播效果》和《詳解Android中Fragment的兩種創建方式》以及《Android中fr
最近在做Android的項目,其中部分涉及到圖像處理的內容.這裡先講述如何調用Camera應用程序進行拍照,並截圖和保存顯示在ImageView控件中以及遇到的困難和解決
SurfaceHolder.Callback (2012-03-09 09:15:44) 轉載▼ 標簽: 雜談 分類: android