[問題] 用app 執行底層的 shell command

看板AndroidDev作者 (藍藍欠)時間9年前 (2016/10/23 16:33), 9年前編輯推噓0(0013)
留言13則, 4人參與, 最新討論串1/1
今天試了一整天,有點崩潰..開發環境 Android studio 2.1,試了網路上範例 device 是 nexus 6P 安卓7.0 onCreate(){ TextView tex = (TextView)findViewById(R.layout.textView); try { execCommand("ls"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void execCommand(String command) throws IOException { Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec(command); try { if (proc.waitFor() != 0) { System.err.println("exit value = " + proc.exitValue()); } BufferedReader in = new BufferedReader(new InputStreamReader( proc.getInputStream())); StringBuffer stringBuffer = new StringBuffer(); String line = null; while ((line = in.readLine()) != null) { stringBuffer.append(line+"-"); } tex.setText(stringBuffer.toString()); } catch (InterruptedException e) { System.err.println(e); } } 他可以印出執行完 "ls"後的字串,並展示在 app 上,其他 cat /proc/sys/net/ipv4/ip_forward 也可以展示出來 ----------------------------------------------------------------------------- 可我想要寫入 echo 0 > /proc/sys/net/ipv4/ip_forward 卻一直無法成功,以下是 code protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { execCommand("echo 0 > /proc/sys/net/ipv4/ip_forward\n"); } catch(IOException e){ e.printStackTrace(); } }//end onCreate public void execCommand(String command) throws IOException { java.lang.Process su = Runtime.getRuntime().exec(command); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes("echo 0 > /proc/sys/net/ipv4/ip_forward\n"); outputStream.writeBytes("exit\n"); outputStream.flush(); } ------------------------------------------------------------------------------ 另外的嘗試是依樣以上面的程式範例 execCommand("echo 0 > /proc/sys/net/ipv4/ip_forward\n"); 改成 execCommand("su"); Android studio 出現以下 error: W/System.err: java.io.IOException: Cannot run program "su": error=13, Permission denied com.example.user.myapplication W/System.err: at java.lang.ProcessBuilder.start(ProcessBuilder.java:983) com.example.user.myapplication W/System.err: at java.lang.Runtime.exec(Runtime.java:691) com.example.user.myapplication W/System.err: at java.lang.Runtime.exec(Runtime.java:524) com.example.user.myapplication W/System.err: at java.lang.Runtime.exec(Runtime.java:421) com.example.user.myapplication W/System.err: at com.example.user.myapplication.MainActivity.execCommand(MainActivity.java:41) com.example.user.myapplication W/System.err: at com.example.user.myapplication.MainActivity.onCreate(MainActivity.java:33) com.example.user.myapplication W/System.err: at android.app.Activity.performCreate(Activity.java:6664) com.example.user.myapplication W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) com.example.user.myapplication W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) com.example.user.myapplication W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) com.example.user.myapplication W/System.err: at android.app.ActivityThread.-wrap12(ActivityThread.java) com.example.user.myapplication W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) com.example.user.myapplication W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102) com.example.user.myapplication W/System.err: at android.os.Looper.loop(Looper.java:154) com.example.user.myapplication W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6077) com.example.user.myapplication W/System.err: at java.lang.reflect.Method.invoke(Native Method) com.example.user.myapplication W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) com.example.user.myapplication W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) com.example.user.myapplication W/System.err: Caused by: java.io.IOException: error=13, Permission denied com.example.user.myapplication W/System.err: at java.lang.UNIXProcess.forkAndExec(Native Method) com.example.user.myapplication W/System.err: at java.lang.UNIXProcess.<init>(UNIXProcess.java:133) com.example.user.myapplication W/System.err: at java.lang.ProcessImpl.start(ProcessImpl.java:128) com.example.user.myapplication W/System.err: at java.lang.ProcessBuilder.start(ProcessBuilder.java:964) com.example.user.myapplication W/System.err: ... 17 more 可以編譯,可以看到手機上有app 請大俠指教... 萬分感激,謝謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 58.115.110.28 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1477211618.A.646.html ※ 編輯: blueblueChen (58.115.110.28), 10/23/2016 16:41:41

10/23 16:52, , 1F
你有權限?
10/23 16:52, 1F

10/23 17:06, , 2F
請問您指的權限是?
10/23 17:06, 2F
※ 編輯: blueblueChen (58.115.110.28), 10/23/2016 17:15:44

10/23 17:29, , 3F
我在AndroidManifest.xml加上
10/23 17:29, 3F

10/23 17:29, , 4F
<uses-permission android:name="android.permissio
10/23 17:29, 4F

10/23 17:30, , 5F
n.ACCESS_SUPERUSER"/> 結果相同...
10/23 17:30, 5F

10/23 17:36, , 6F
你沒有用過Linux吧? 第一次的問題是你沒要系統管理員權限
10/23 17:36, 6F

10/23 17:36, , 7F
第二次是你要了但是拿不到 第三次(你剛剛的推文)是你的系統不
10/23 17:36, 7F

10/23 17:37, , 8F
給你 簡單講 這種code必須要在"root過"的手機上才能跑
10/23 17:37, 8F

10/23 18:10, , 9F
您好,我聽了各位的話...root nexus 6p 手機
10/23 18:10, 9F

10/23 18:11, , 10F
然後他就可以了! 只是我很那悶,我在還沒root時
10/23 18:11, 10F

10/23 18:11, , 11F
就已經看到 system/xbin/su 有這個檔案了,為啥我還
10/23 18:11, 11F

10/23 18:11, , 12F
需要 root tool??
10/23 18:11, 12F

10/23 18:20, , 13F
樓上已經有人說出你該補的觀念囉
10/23 18:20, 13F
文章代碼(AID): #1O37NYP6 (AndroidDev)