试图以编程方式更新我的apk导致解析错误

时间:2016-01-27 11:50:49

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

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

通过以下代码可以很好地下载它,但是当安装意图开始时它会抛出:“解析错误:解析包时出现问题”

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

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

这是我的Task类:

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
        }
    }
}

1 个答案:

答案 0 :(得分:0)

好吧,这是我自己的错误。对于任何扫描过的人和对我完美的工作代码感到沮丧感到抱歉。

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

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

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

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

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
        }
    }
}