2013-12-14 6 views
1

Я пытаюсь создать простую программу на Java для установки APK на устройствах Android, подключенных через USB. Использование ABD вручную, то все работает отлично, но я хотел бы дать простой одну кнопку мыши установить опцию в моем приложении, но по какой-то причине код разве рабочий:Приложение Java для установки APK на android

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, но только нашел темы при установке APK из приложения Android, а не из приложения Java на рабочем столе.

Спасибо за помощь;

EDIT: Новый код выглядит следующим образом теперь с ProcessBuilder управления ADB вызова:

 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); 

АНК синхронизация просто не может сразу со статусом 1 возвращается к консоли.

Если я вручную указать местоположение АПК

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

тогда я получаю ту же ошибку, что и исходный код, процесс возвращается статус 141, и после определенного периода времени, процесс синхронизации завершается, но .apk разве доступен на столе. Я также получаю тот же результат, если попытаюсь с APK намного меньше, чем мое приложение 700mb (как в 500kb .apk дает те же результаты).

EDIT3: Я также попытался сменить команду, чтобы нажать apk, и она работает без ошибок, apk будет без проблем работать с /mnt/sdcard/test/1.apk.

Энди

+0

Кто-нибудь может предложить некоторую помощь по этому вопросу? – andy

ответ

1

я думаю, это потому, что ваше приложение Java не будучи в состоянии решить ADB двоичную. попробуйте добавить двоичный файл 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 = новый ProcessBuilder («adb», «arg1»,); аргументы не могут быть переданы runtime.exec(). он может просто выполнить одну программу. processbuilder удобен в этом случае, я полагаю. Это стоит попробовать! –

+0

Спасибо, почти там, я думаю, но я получаю следующее исключение, когда я пытаюсь запустить вышеуказанный код: java.io.IOException: не удается запустить программу «adb install -r /home/geeky/Desktop/1.apk»: error = 2, Нет такого файла или каталога \t в java.lang.ProcessBuilder.start (ProcessBuilder.java:1041) – andy

+0

сделать это: ProcessBuilder pb = new ProcessBuilder ("adb", "install", "/ home/geeky /Desktop/1.apk "); D на вашем рабочем столе прописной ... unix чувствителен к регистру, я надеюсь, что путь правильный. : D –

Смежные вопросы