Java Application在android上安装APK

时间:2013-12-14 07:39:24

标签: java android adb

我正在尝试用Java创建一个简单的应用程序,以便在通过USB连接的Android设备上安装APK。手动使用ABD然后一切正常,但我想在我的应用程序中给出一个简单的单按钮安装选项,但由于某种原因代码不起作用:

    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安装-r我自己从终端然后一切正常)。

我搜索过stackoverflow但是只发现了从Android应用程序安装APK的线程,而不是桌面Java应用程序。

感谢您的帮助;

编辑:现在新代码看起来像这样,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);

apk同步立即失败,状态为1返回控制台。

如果我手动指定apk位置

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

然后我得到与原始代码相同的错误,该过程返回状态141,并且在一段时间后同步过程完成但是.apk在表上不可用。如果我尝试使用比我的700mb应用程序小得多的APK(因为500kb .apk会得到相同的结果),我也会得到相同的结果。

EDIT3:我也尝试更改命令以推送apk并且它可以正常工作,apk会毫无问题地推送到/mnt/sdcard/test/1.apk。

安迪

1 个答案:

答案 0 :(得分:1)

我想这是因为你的java应用程序无法解析adb二进制文件。尝试在环境变量中添加adb二进制文件,以便可以从任何地方访问它。

试试这个:

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