我创建了一个Android应用,该应用在用户登录后检查更新。 我在数据库中有一个表,其中包含apk版本名称,版本代码和发布日期,以解析客户端上的apk当前版本。
如果我更改build.gradle中的版本名称和版本代码,并将新的APK上传到服务器,则我还会更改表中的版本信息。
问题是,尽管看起来工作正常(弹出安装屏幕并提示安装成功),但应用程序不会自我更新。
版本代码和版本名称仍然与以前相同,并且我处于无休止的下载和更新同一应用程序的循环中,而当前应用程序没有任何更改。
我在做什么错了?
以下是您感兴趣的代码:
在MainActivity中使用checkversion方法:
private void checkversion(){
PackageInfo packageInfo = null;
try {
packageInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "Error occured identifiing the container package of this application.");
}
final TextView tvloadingbar = dialog.getDialog().findViewById(R.id.tvLoadingBar);
runOnUiThread(new Runnable() {
@Override
public void run() {
tvloadingbar.setText("Checking version...");
}
});
final String version = packageInfo.versionName;
final int versioncode = packageInfo.versionCode;
Log.w(TAG, String.format("Checking the versions, actual versionname: %s, actual versioncode: %d", version, versioncode));
Log.w(TAG, "Parsing the server...");
//Query the version from database
ClientAPI.setRequest(new Request.Builder().url(ClientAPI.getBaseurl() + "mobilepackage/versioninfo").build());
try {
Response response = ClientAPI.getClient().newCall(ClientAPI.getRequest()).execute();
if(response.isSuccessful()){
String result = response.body().string();
try {
JSONObject object = new JSONObject(result);
String serverversion = object.getString("Version_Name");
int serverversioncode = object.getInt("Version_Code");
Log.w(TAG, String.format("Got a response from server, versionname: %s, versioncode: %d ", serverversion, serverversioncode));
if(serverversion!=null && serverversioncode!=0){
//check if version codes matched, if true, do nothing
//else download the apk and install it.
if(serverversion.equals(version) && serverversioncode==versioncode){
runOnUiThread(new Runnable() {
@Override
public void run() {
tvloadingbar.setText("Nincs szükség frissítésre");
}
});
Log.w(TAG,"Server versions matched.");
return;
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
tvloadingbar.setText("Update needed");
}
});
Log.w(TAG, "Update needed.");
downloadapk(tvloadingbar);
}
} else {
Log.w(TAG, "No apk to deploy.");
return;
}
} catch (JSONException e) {
Log.w(TAG, "Error occured parsing the JSON Object of versions.");
}
} else {
Log.w(TAG,"Could not determine the version codes. Server response unsuccessful.");
}
} catch (IOException e) {
Log.w(TAG, "Error occured query the version info");
}
}
此处有downloadapk方法
private void downloadapk(final TextView tvloadingbar){
runOnUiThread(new Runnable() {
@Override
public void run() {
tvloadingbar.setText("Downloading new version...");
}
});
// synchronous okhttp call
ClientAPI.setRequest(new Request.Builder().url(ClientAPI.getBaseurl()+ "Mobile_Distro/app-debug.apk").build());
try {
Response response = ClientAPI.getClient().newCall(ClientAPI.getRequest()).execute();
InputStream is = response.body().byteStream();
File file = new File(getExternalFilesDir(null) + File.separator + "app-debug.apk");
BufferedInputStream bis = new BufferedInputStream(is);
OutputStream output = new FileOutputStream(file);
final int SIZE = 10485760;
byte[] data = new byte[SIZE];
long total = 0;
int count;
while ((count = bis.read(data)) != -1){
total += count;
output.write(data, 0, count);
Log.w("WROTE", String.format("%d bytes",total));
}
Log.w(TAG, String.format("Download successful. Downloaded: %d bytes", total));
output.flush();
output.close();
bis.close();
installapk(tvloadingbar, file);
} catch (IOException e) {
Log.w(TAG,String.format("Downloading new version failed. Details: \n %s",e.getMessage()));
}
}
以及apk的安装方法(或安装方式)
private void installapk(File file){
Log.w(TAG, "Installing new version...");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
我在多部电话上尝试过此操作,但均未显示错误,但均未安装新版本。我真的不知道这是怎么回事。尝试在安装后触摸打开,关闭并启动该应用程序,无用,该应用程序以旧版本存在。
有什么建议吗?
答案 0 :(得分:0)
好吧,我发布的代码没有错。问题出在版本代码上。 Web Api返回了不同的版本代码,该版本代码与apk的版本代码不匹配。
感谢弗拉迪斯拉夫·马特维琴科的建议。