Wykonaj polecenie ADB z programu Java
Program, nad którym pracuję, używa ADB (Android Debug Bridge) do wysyłania plików do mojego telefonu:
for (String s : files)
String cmd = "adb -s 0123456789ABCDEF push " + s + " /mnt/sdcard/" + s;
try {
InputStream is = Runtime.getRuntime().exec(cmd).getInputStream();
while (is.read() != -1) {}
} catch (IOException e) {
e.printStackTrace();
}
Chcę, aby program czekał, aż ADB zakończy transmisję, ale ADB działa jako demon i dlatego nigdy nie kończy. Ale program jest kontynuowany niezmiernie i jakoś pliki nie są wysyłane do mojego telefonu (bez wyjątków w dzienniku). Kiedy uruchamiam polecenie z konsoli, działa bez problemów.
Co ja robię źle? Jak prawidłowo przesyłać pliki przez ADB?
Zanotujis.read() == -1
nie zadziała, ponieważ demon ADB piszewszystkie wyjścia do standardowego wyjścia systemu. Próbowałem przekazać go do pliku tekstowego. Pozostał pusty, a wyjście nadal było zapisywane na terminalu
EDYTOWAĆ: Odczytanie strumienia błędów procesu ADB zwróciło pomoc adb dla każdegoadb push
-dowództwo. Ponownie: Thedokładny komendy (skopiowane z konsoli Eclipse) działają w terminalu
EDYCJA 2: Używanie ProcessBuildera zamiastRUntime.getRuntime.exec()
spowodował następujący błąd:
java.io.IOException: Cannot run program "adb -s 0123456789ABCDEF push "inputfile "outputfile""": error=2, File or directory not found
w ProcessBuilderstart()
-metod To samo dzieje się, gdy używasz ścieżki bezwzględnej dla ADB (/usr/bin/adb
). Ciągi wejściowe i wyjściowe są również ścieżkami bezwzględnymi/home/sebastian/testfile
i zdecydowanie istnieje. Podczas uruchamiania poleceń z terminala (ciąg „cmd” drukowane, kopiowanie i wklejanie) wszystko nadal działa poprawnie.