在实现设备功能自动化的过程中,Android 开发人员经常遇到以编程方式执行 shell 命令的需要。虽然从终端仿真器完成此操作很简单,但从 Java 执行相同的命令可能会带来挑战。这篇问答文章深入探讨了为什么在终端模拟器中工作的相同命令在 Java 中可能无法成功,并提供了克服此障碍的解决方案。
一位开发人员尝试使用 Android KitKat 中新引入的 screenrecord 命令来记录屏幕,他注意到该命令在终端模拟器中完美运行,但在 Java 应用程序中执行时失败进程.exec()。他们寻求有关问题所在以及如何解决的指导。
问题的症结在于 screenrecord 命令需要提升权限,通常通过使用“su”(超级用户)来授予。从终端仿真器执行命令时,用户手动提供“su”,授予必要的权限。然而,当从 Java 执行命令时,应用程序缺少所需的海拔。
解决方案在于在 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中文网其他相关文章!