尝试以编程方式更新我的 apk 导致解析错误
Trying to update my apk programmatically results in parse error
我需要在没有 Google Play 的情况下更新我的应用程序。所以我把我的apk上传到我的服务器,需要的时候可以下载。
通过下面的代码可以正常下载,但是安装intent开始的时候抛出:"Parse Error: There is a problem parsing the package"
如果我尝试 运行 手动下载 apk,它仍然会出现同样的错误。
但是,如果我通过 USB 传输 apk 然后 运行 它,安装会很顺利。所以这个问题不是apk本身的问题。
这是我的任务 class:
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
}
}
}
好吧,这是我自己的错误。对于扫描到我完美的工作代码并感到沮丧的任何人,我们深表歉意。
原因是我,试图通过 USB 直接从 Android Studio 更新我 运行 的应用程序。尽管它在 "Release" 模式下 运行ning,它会在新下载的 apk 文件上抛出解析错误(我仍然不确定为什么)。
所以,我刚刚生成了一个带有适当(较低)版本控制的签名 apk;复制到phone然后安装。只有这样,应用程序才能正确下载和 运行 更新版本的 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
}
}
}
我需要在没有 Google Play 的情况下更新我的应用程序。所以我把我的apk上传到我的服务器,需要的时候可以下载。
通过下面的代码可以正常下载,但是安装intent开始的时候抛出:"Parse Error: There is a problem parsing the package"
如果我尝试 运行 手动下载 apk,它仍然会出现同样的错误。
但是,如果我通过 USB 传输 apk 然后 运行 它,安装会很顺利。所以这个问题不是apk本身的问题。
这是我的任务 class:
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
}
}
}
好吧,这是我自己的错误。对于扫描到我完美的工作代码并感到沮丧的任何人,我们深表歉意。
原因是我,试图通过 USB 直接从 Android Studio 更新我 运行 的应用程序。尽管它在 "Release" 模式下 运行ning,它会在新下载的 apk 文件上抛出解析错误(我仍然不确定为什么)。
所以,我刚刚生成了一个带有适当(较低)版本控制的签名 apk;复制到phone然后安装。只有这样,应用程序才能正确下载和 运行 更新版本的 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
}
}
}