【问题标题】:Trying to update my apk programmatically results in parse error尝试以编程方式更新我的 apk 会导致解析错误
【发布时间】:2016-01-27 11:50:49
【问题描述】:

我需要在没有 Google Play 的情况下更新我的应用程序。所以我将我的 apk 上传到我的服务器,以便在需要时下载。

通过以下代码可以正常下载,但是当启动安装意图时,它会抛出:“Parse Error: There is a problem parsing the package”

如果我尝试手动运行下载的 apk,它仍然会出现同样的错误。

但是,如果我通过 USB 传输 apk 然后运行它,它会顺利安装。所以这个问题与apk本身无关。

这是我的任务类:

class Update implements Runnable {
    @Override
    public void run() {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect(InetAddress.getByName("mysite.com"));
            ftpClient.login("mysite.com", "123456"));
            ftpClient.enterLocalPassiveMode();
            String remoteFile1 = "/httpdocs/program/app-release.apk";
            String downPath = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS).getAbsolutePath();
            File myapk = new File(downPath + "/app-release.apk");
            OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(myapk));
            boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
            outputStream1.close();
            myapk.setReadable(true, false);
            if (!success) {
                ftpClient.logout();
                ftpClient.disconnect();
                return;
            } else {
                Intent promptInstall = new Intent(Intent.ACTION_VIEW)
                        .setDataAndType(Uri.fromFile(myapk), "application/vnd.android.package-archive")
                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(promptInstall);
            }
        }
        catch (Exception ex) {
            //catch exception
        }
    }
}

【问题讨论】:

  • 问题必须在您的下载代码中。看来apk文件下载不成功。
  • @FebiMathew 可能是的,但我看不到。
  • 此链接可能会对您有所帮助。 stackoverflow.com/questions/4967669/…
  • @FebiMathew 好吧,现在我尝试使用 HttpURLConnection 而不是 FTPClient 重写下载代码。还是一样的错误。

标签: java android android-asynctask ftp ftp-client


【解决方案1】:

好吧,这是我自己的错误。很抱歉有人扫描了我的完美工作代码并对此感到沮丧。

原因是我,试图更新我通过 USB 直接从 Android Studio 运行的应用程序。尽管它一直在“发布”模式下运行,但它会在新下载的 apk 文件上引发解析错误(我仍然不确定为什么)。

所以,我刚刚生成了一个带有适当(较低)版本控制的签名 apk;复制到手机中,然后安装。只有这样,应用程序才能正确下载和运行更新版本的 apk 文件。按预期更新自身。

让这成为任何人和我做同样事情的人的例子。 在测试手动更新功能时使用生成的 apk。

最后,我想分享我的代码。我将其从 FTP 更改为通过 HttpURLConnection 直接下载。两个版本都可以正常工作(问题中的代码和这个)。因此,请随意选择适合您工作的那个。

class Update implements Runnable {
    @Override
    public void run() {
        try {
            URL url = new URL("mysite.com/app-release.apk");
            HttpURLConnection c = (HttpURLConnection) url.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
            String PATH = getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS).getAbsolutePath();
            File file = new File(PATH);
            File outputFile = new File(file, "app-release.apk");
            FileOutputStream fos = new FileOutputStream(outputFile);
            InputStream is = c.getInputStream();
            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len1);
            }
            fos.close();
            is.close();
            Intent promptInstall = new Intent(Intent.ACTION_VIEW)
                    .setDataAndType(Uri.fromFile(outputFile), "application/vnd.android.package-archive")
                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(promptInstall);
        } catch (Exception ex) {
            //catch exception
        }
    }
}

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多