Я создал приложение для Android, которое проверяет наличие обновлений после входа пользователя.
У меня есть таблица в базе данных, которая содержит имя версии apk, код версии и дату выпуска для анализа текущей версии apk на клиенте.
Если я меняю имя версии и код версии в build.gradle и загружаю новый apk на сервер, я также изменяю информацию о версии в таблице.
Проблема в том, что, несмотря на то, что все работает нормально (экран установки появляется и появляется сообщение об успешной установке), приложение не обновляется.
Код версии и имя версии по-прежнему остаются прежними, и я нахожусь в бесконечном цикле загрузки и обновления одного и того же приложения снова и снова без изменения текущего приложения.
Что я делаю не так?
Вот коды интереса:
В MainActivity метод проверки версии:
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);
}
Я пробовал это на нескольких телефонах, ни один из них не указывает на ошибки, но ни один из них не устанавливает новую версию. Я действительно понятия не имею, что здесь происходит. Пробовал касаться открытия после установки, закрытия и запуска приложения, бесполезно, приложение существует как старая версия.
Есть предложения?