2013-12-14 81 views
1

我想在Java中做一個簡單的應用程序來在通過USB連接的android設備上安裝APK。使用ABD手動然後一切工作正常,但我想給一個簡單的單按鈕,單擊我的應用程序中的安裝選項,但由於某些原因的代碼心不是工作:Java應用程序在android上安裝APK

try { 
     abdsourcesync = apkpath; 
     progress.setString("sync in progress"); 
     System.out.println("Starting Sync via adb with command " + "adb" 
       + " install -r " + apkpath); 

     Process process = Runtime.getRuntime().exec(
       "adb" + " install -r " + apkpath); 
     InputStreamReader reader = new InputStreamReader(
       process.getInputStream()); 
     Scanner scanner = new Scanner(reader); 
     scanner.close(); 
     int exitCode = process.waitFor(); 
     System.out.println("Process returned: " + exitCode); 

的進程退出時的141,但狀態不我可以看到的其他錯誤,但是當我在平板電腦上查看.APK尚未安裝。我已經檢查過,以確保設備上存在根植並支持第三方應用程序等的空間,所以我確定問題出在我的java而不是android設備上(正如我所說如果我運行ADB install -r自己從終端,然後一切正常)。

我已經搜索了周圍的stackoverflow,但只發現線程安裝從Android應用程序,而不是從桌面Java應用程序的APK。

感謝您的幫助;

編輯:新的代碼現在看起來是這個樣子的ProcessBuilder管理亞行呼籲:

 try { 
      abdsourcesync = apkpath; 
      progress.setString("sync in progress"); 
      System.out.println("Starting Sync via adb with command " + "adb" 
        + " install -r " + apkpath); 

      ProcessBuilder apksync = new ProcessBuilder("adb", " install -r ", apkpath); 

      apksync = apksync.redirectErrorStream(true); 
/*   Process process = Runtime.getRuntime().exec(
        "adb" + " install -r " + apkpath);*/ 
      Process process = apksync.start(); 
      InputStreamReader reader = new InputStreamReader(
        process.getInputStream()); 
      Scanner scanner = new Scanner(reader); 
      scanner.close(); 
      int exitCode = process.waitFor(); 
      System.out.println("Process returned: " + exitCode); 

apk的同步,只不過沒有爲1的狀態返回到控制檯立竿見影。

如果我手動指定APK位置

ProcessBuilder apksync = new ProcessBuilder("adb","install","/home/geeky/Desktop/1.apk"); 

然後我得到了同樣的錯誤作爲原代碼,返回狀態141並在一段時間後,同步過程完成,但.apk文件心不是可用在桌子上。如果我嘗試使用比我的700MB應用程序小得多的APK,則也會得到相同的結果(如在500kb .apk中給出相同的結果)。編輯3:我也嘗試改變命令來推動apk,它沒有錯誤,它會毫無問題地推送到/mnt/sdcard/test/1.apk。

安迪

+0

任何人都能夠提供對這個問題有所幫助? – andy

回答

1

我想這是因爲不能夠解決ADB二進制Java應用程序。嘗試在您的環境變量中添加adb二進制文件,以便從任何地方訪問它。

試試這個:

ProcessBuilder pb = new ProcessBuilder("cmd","arg1"); 
pb = pb.redirectErrorStream(true); 
    Process proc = pb.start(); 
    InputStream is = proc.getInputStream(); 
+0

我明白了....用processbuilder代替runtime.exec() ProcessBuilder b = new ProcessBuilder(「adb」,「arg1」,); 參數不能傳遞給runtime.exec()。它只能執行一個程序。在這種情況下,我認爲processbuilder非常方便。這值得一試! –

+0

謝謝,幾乎在那裏我想,但當我嘗試運行上面的代碼時,出現以下異常:java.io.IOException:無法運行程序「adb install -r /home/geeky/Desktop/1.apk」:錯誤= 2,沒有這樣的文件或目錄 \t at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041) – andy

+0

這樣做: ProcessBuilder pb = new ProcessBuilder(「adb」,「install」,「/ home/geeky /Desktop/1.apk「); 桌面上的D是大寫的...... unix區分大小寫,我希望路徑是正確的。 :D –

相關問題