【问题标题】:Java Application to install APK on androidJava 应用程序在 android 上安装 APK
【发布时间】:2013-12-14 19:18:33
【问题描述】:

我正在尝试用 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 install -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。

安迪

【问题讨论】:

  • 有人能就这个问题提供一些帮助吗?

标签: java android adb


【解决方案1】:

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

试试这个:

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

【讨论】:

  • 我明白了....使用 processbuilder 而不是 runtime.exec() ProcessBuilder b = new ProcessBuilder("adb", "arg1",);参数不能传递给 runtime.exec()。它只能执行一个程序。我想在这种情况下 processbuilder 很方便。这值得一试!
  • 谢谢,我想几乎就在那里,但是当我尝试运行上述代码时出现以下异常: java.io.IOException: Cannot run program "adb install -r /home/geeky/ Desktop/1.apk": error=2, no such file or directory at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
  • 这样做:ProcessBuilder pb = new ProcessBuilder("adb","install","/home/geeky/Desktop/1.apk");你桌面上的 D 是大写的……unix 是区分大小写的,我希望路径是正确的。 :D
  • 谢谢,文件路径已正确传递,但我忘记将字符串更改为 ,而不是 + 以溢出 args。我现在只是得到一个错误过程返回 1。如果有帮助,我已经编辑了主帖子以反映我的新代码。
  • 还有什么其他想法,为什么这对我的新代码不起作用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 2017-09-28
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
相关资源
最近更新 更多