Android-java怎么调用命令行的命令?

Android-java怎么调用命令行的命令?

灵芸 发布于 2016-10-29 字数 2830 浏览 1057 回复 1

其实是个android的问题。我想在sdcard里创建文件夹。但是创建失败,最后发现是sdcard没有写权限。你在程序里加了写的权限也不好使。只能先在命令行里敲chomd 777 /mnt/sdcard,再执行程序就好了。目前知道java执行命令行的方法是Runtime.getRuntime().exec("chomd 777 /mnt/sdcard");但是不行。错误为:
12-04 16:10:42.580: W/System.err(9092): java.io.IOException: Error running exec(). Command: [chomd, 777, /mnt/sdcard] Working Directory: null Environment: null
12-04 16:10:42.580: W/System.err(9092): at java.lang.ProcessManager.exec(ProcessManager.java:226)
12-04 16:10:42.580: W/System.err(9092): at java.lang.Runtime.exec(Runtime.java:196)
12-04 16:10:42.580: W/System.err(9092): at java.lang.Runtime.exec(Runtime.java:285)
12-04 16:10:42.580: W/System.err(9092): at java.lang.Runtime.exec(Runtime.java:218)
12-04 16:10:42.580: W/System.err(9092): at cn.testandroidproject.TestAndroidProjectActivity.click1(TestAndroidProjectActivity.java:55)
12-04 16:10:42.580: W/System.err(9092): at java.lang.reflect.Method.invokeNative(Native Method)
12-04 16:10:42.580: W/System.err(9092): at java.lang.reflect.Method.invoke(Method.java:521)
12-04 16:10:42.580: W/System.err(9092): at android.view.View$1.onClick(View.java:2067)
12-04 16:10:42.580: W/System.err(9092): at android.view.View.performClick(View.java:2408)
12-04 16:10:42.580: W/System.err(9092): at android.view.View$PerformClick.run(View.java:8816)
12-04 16:10:42.580: W/System.err(9092): at android.os.Handler.handleCallback(Handler.java:587)
12-04 16:10:42.580: W/System.err(9092): at android.os.Handler.dispatchMessage(Handler.java:92)
12-04 16:10:42.580: W/System.err(9092): at android.os.Looper.loop(Looper.java:123)
12-04 16:10:42.580: W/System.err(9092): at android.app.ActivityThread.main(ActivityThread.java:4627)
12-04 16:10:42.580: W/System.err(9092): at java.lang.reflect.Method.invokeNative(Native Method)
12-04 16:10:42.580: W/System.err(9092): at java.lang.reflect.Method.invoke(Method.java:521)
12-04 16:10:42.580: W/System.err(9092): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-04 16:10:42.580: W/System.err(9092): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-04 16:10:42.580: W/System.err(9092): at dalvik.system.NativeStart.main(Native Method)
12-04 16:10:42.580: W/System.err(9092): Caused by: java.io.IOException: Permission denied
12-04 16:10:42.580: W/System.err(9092): at java.lang.ProcessManager.exec(Native Method)
12-04 16:10:42.580: W/System.err(9092): at java.lang.ProcessManager.exec(ProcessManager.java:224)
12-04 16:10:42.580: W/System.err(9092): ... 18 more
请问应该怎么解决?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

归属感 2017-07-20 1 楼

我共享份代码 2.1 ~ 4.0 测试都能通过

/** 执行 shell 命令之后返回 String 类型的结果 */
public static StringexecShellStr(String cmd)
{
String[] cmdStrings = new String[] {"sh", "-c", cmd};
String retString = "";

try
{
Process process = Runtime.getRuntime().exec(cmdStrings);
BufferedReader stdout =
new BufferedReader(new InputStreamReader(
process.getInputStream()), 7777);
BufferedReader stderr =
new BufferedReader(new InputStreamReader(
process.getErrorStream()), 7777);

String line = null;

while ((null != (line = stdout.readLine()))
|| (null != (line = stderr.readLine())))
{
if (false == isStringEmpty(line))
{
retString += line + "n";
}
}

}
catch (Exception e)
{
e.printStackTrace();
}

return retString;
}

ps: 如果你在应用里面执行 shell,是以应用的用户来执行,如果是特殊的目录,需要root权限的,也就是先执行 su ,在执行你的命令
而,如果通过 adb 执行 shell 的话,上来就是一个终端用户(或者 root) 所以可能上来就有很高的权限
另外,看一下 /mnt/sdcard 是否有文件在去操作

更新
命令行用的是 adb 与手机的连接,登录进去之后是一个终端登录的用户,这一点我在答案中也有说明,有些手机的 rom 已经规定了 adb 进来就是 root,只有 root 才能随意的去修改系统文件属性和权限。而普通的 apk 应用程序在调用 shell 命令的时候是以对应应用自己的用户来执行的,即普通用户。默认情况下 普通用户 肯定是不能操作系统文件的。
su是一个命令,可以给普通用户提权,让普通用户临时拥有 root 权限去做普通用户不能做的事情。

但是很多手机并没有 "root" (类似苹果的越狱),所以,普通用户使用 su 也会有类似 uid xxxx 没有权限的提示,所以,不能用普通用户去修改 /mnt/sdcard 的属性

祝好,
斑驳敬上