Apk загрузка и установка успешны, но версия все та же.Как это может быть? - PullRequest
0 голосов
/ 19 ноября 2018

Я создал приложение для 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);
}

Я пробовал это на нескольких телефонах, ни один из них не указывает на ошибки, но ни один из них не устанавливает новую версию. Я действительно понятия не имею, что здесь происходит. Пробовал касаться открытия после установки, закрытия и запуска приложения, бесполезно, приложение существует как старая версия.

Есть предложения?

1 Ответ

0 голосов
/ 19 ноября 2018

Ну, в коде, который я разместил, не было ничего плохого.Проблема была с кодом версии.Web Api вернул другой код версии, который не совпадал с кодом apk.

Спасибо Владиславу Матвиенко за предложение.

...