APK下载和安装成功,但版本仍然相同。怎么可能呢?

时间:2018-11-19 09:15:11

标签: android installation apk updates

我创建了一个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);
}

我在多部电话上尝试过此操作,但均未显示错误,但均未安装新版本。我真的不知道这是怎么回事。尝试在安装后触摸打开,关闭并启动该应用程序,无用,该应用程序以旧版本存在。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

好吧,我发布的代码没有错。问题出在版本代码上。 Web Api返回了不同的版本代码,该版本代码与apk的版本代码不匹配。

感谢弗拉迪斯拉夫·马特维琴科的建议。