首頁  >  文章  >  Java  >  為什麼我的 Shell 命令在終端機中可以工作,但在 Java 中卻失敗?

為什麼我的 Shell 命令在終端機中可以工作,但在 Java 中卻失敗?

Patricia Arquette
Patricia Arquette原創
2024-11-10 10:06:03450瀏覽

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

從Android 執行Shell 指令:從終端到Java 的旅程

在實現裝置功能自動化的過程中,Android 開發人員經常會遇到以程式方式執行shell命令的需要。雖然從終端模擬器完成此操作很簡單,但從 Java 執行相同的命令可能會帶來挑戰。這篇問答文章深入探討了為什麼在終端模擬器中工作的相同命令在 Java 中可能無法成功,並提供了克服此障礙的解決方案。

問題:Java 中的Shell 命令執行失敗

一位開發人員嘗試使用Android KitKat 中新引入的screenrecord 命令來記錄屏幕,他注意到該命令在終端模擬器中完美運行,但在使用Process.exec() 從Java 應用程式中執行時失敗。他們尋求有關問題所在以及如何解決的指導。

答案:授予指令權限

問題的癥結在於 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