作者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://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1477211618.A.646.html
※ 编辑: blueblueChen (58.115.110.28), 10/23/2016 16:41:41
1F:→ ssccg: 你有权限? 10/23 16:52
2F:→ blueblueChen: 请问您指的权限是? 10/23 17:06
※ 编辑: blueblueChen (58.115.110.28), 10/23/2016 17:15:44
3F:→ blueblueChen: 我在AndroidManifest.xml加上 10/23 17:29
4F:→ blueblueChen: <uses-permission android:name="android.permissio 10/23 17:29
5F:→ blueblueChen: n.ACCESS_SUPERUSER"/> 结果相同... 10/23 17:30
6F:→ y3k: 你没有用过Linux吧? 第一次的问题是你没要系统管理员权限 10/23 17:36
7F:→ y3k: 第二次是你要了但是拿不到 第三次(你刚刚的推文)是你的系统不 10/23 17:36
8F:→ y3k: 给你 简单讲 这种code必须要在"root过"的手机上才能跑 10/23 17:37
9F:→ blueblueChen: 您好,我听了各位的话...root nexus 6p 手机 10/23 18:10
10F:→ blueblueChen: 然後他就可以了! 只是我很那闷,我在还没root时 10/23 18:11
11F:→ blueblueChen: 就已经看到 system/xbin/su 有这个档案了,为啥我还 10/23 18:11
12F:→ blueblueChen: 需要 root tool?? 10/23 18:11
13F:→ KeySabre: 楼上已经有人说出你该补的观念罗 10/23 18:20