我正在开发的程序使用ADB(Android Debug Bridge)将文件发送到我的手机:
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();
}
我希望程序等待ADB传输完成,但ADB作为一个守护进程运行,因此永远不会完成。但程序立即继续执行,某种方式文件没有发送到我的手机(日志中没有异常)。当我从控制台运行命令时,它可以正常工作。
我做错了什么?如何正确地通过ADB发送文件?
注意:`is.read() == -1` 不起作用,因为ADB守护进程将所有输出写入系统标准输出。我尝试将其转发到文本文件中。它保持为空,输出仍然写入终端。
编辑:读取ADB进程的ErrorStream返回每个 `adb push` 命令的adb帮助。再次强调:确切的命令(从Eclipse控制台复制)在终端中可以工作。
编辑2:使用ProcessBuilder而不是 `RUntime.getRuntime.exec()` 导致以下错误:
java.io.IOException: Cannot run program "adb -s 0123456789ABCDEF push "inputfile "outputfile""": error=2, File or directory not found
在ProcessBuilder的start()方法中,使用绝对路径启动ADB(
/usr/bin/adb
)时也会发生相同的情况。输入文件和输出文件字符串也是绝对路径,例如/home/sebastian/testfile
,并且肯定存在。当从终端运行命令(打印字符串“cmd”,复制粘贴)时,一切仍然正常工作。
/usr/bin/adb
。唯一的特殊字符是下划线,不应该引起任何问题。并且在错误日志中输出与adb help
完全相同。进程的输出(getInputStream()
)为空。 - s3lphadb help
命令没有这个问题。 - s3lph