首页 >Java >java教程 >为什么我的 Shell 命令在终端中可以工作,但在 Java 中却失败?

为什么我的 Shell 命令在终端中可以工作,但在 Java 中却失败?

Patricia Arquette
Patricia Arquette原创
2024-11-10 10:06:03511浏览

Why Does My Shell Command Work in Terminal but Fail in Java?

从 Android 执行 Shell 命令:从终端到 Java 的旅程

在实现设备功能自动化的过程中,Android 开发人员经常遇到以编程方式执行 shell 命令的需要。虽然从终端仿真器完成此操作很简单,但从 Java 执行相同的命令可能会带来挑战。这篇问答文章深入探讨了为什么在终端模拟器中工作的相同命令在 Java 中可能无法成功,并提供了克服此障碍的解决方案。

问题:Java 中的 Shell 命令执行失败

一位开发人员尝试使用 Android KitKat 中新引入的 screenrecord 命令来记录屏幕,他注意到该命令在终端模拟器中完美运行,但在 Java 应用程序中执行时失败进程.exec()。他们寻求有关问题所在以及如何解决的指导。

答案:向命令授予权限

问题的症结在于 screenrecord 命令需要提升权限,通常通过使用“su”(超级用户)来授予。从终端仿真器执行命令时,用户手动提供“su”,授予必要的权限。然而,当从 Java 执行命令时,应用程序缺少所需的海拔。

解决方案:通过 Process Standard 输入提示进行 root 访问

解决方案在于在 Java 代码中提示进行 root 访问。 “su”命令通常后跟一个新行和需要执行的命令。通过抓取“su”进程的标准输入流并向其写入命令,开发人员可以有效地模仿终端模拟器的行为。

以下代码片段说明了解决方案:

try{
    Process su = Runtime.getRuntime().exec("su");
    DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());
    
    outputStream.writeBytes("screenrecord --time-limit 10 /sdcard/MyVideo.mp4\n");
    outputStream.flush();
    
    outputStream.writeBytes("exit\n");
    outputStream.flush();
    su.waitFor();
}catch(IOException e){
    throw new Exception(e);
}catch(InterruptedException e){
    throw new Exception(e);
}

结论

通过采用提供的解决方案,开发人员可以成功地从 Java 应用程序执行 shell 命令,甚至是那些需要提升权限的应用程序。该技术解锁了自动化各种设备功能并增强应用程序功能的能力。

以上是为什么我的 Shell 命令在终端中可以工作,但在 Java 中却失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn