作者blueblueChen (藍藍欠)
看板AndroidDev
標題[問題] 用app 執行底層的 shell command
時間Sun Oct 23 16:33:36 2016
今天試了一整天,有點崩潰..開發環境 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
→ ssccg: 你有權限? 10/23 16:52
→ blueblueChen: 請問您指的權限是? 10/23 17:06
※ 編輯: blueblueChen (58.115.110.28), 10/23/2016 17:15:44
→ blueblueChen: 我在AndroidManifest.xml加上 10/23 17:29
→ blueblueChen: <uses-permission android:name="android.permissio 10/23 17:29
→ blueblueChen: n.ACCESS_SUPERUSER"/> 結果相同... 10/23 17:30
→ y3k: 你沒有用過Linux吧? 第一次的問題是你沒要系統管理員權限 10/23 17:36
→ y3k: 第二次是你要了但是拿不到 第三次(你剛剛的推文)是你的系統不 10/23 17:36
→ y3k: 給你 簡單講 這種code必須要在"root過"的手機上才能跑 10/23 17:37
→ blueblueChen: 您好,我聽了各位的話...root nexus 6p 手機 10/23 18:10
→ blueblueChen: 然後他就可以了! 只是我很那悶,我在還沒root時 10/23 18:11
→ blueblueChen: 就已經看到 system/xbin/su 有這個檔案了,為啥我還 10/23 18:11
→ blueblueChen: 需要 root tool?? 10/23 18:11
→ KeySabre: 樓上已經有人說出你該補的觀念囉 10/23 18:20