我需要在没有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
}
}
}
答案 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
}
}
}