安卓实现APP自动检测软件版本并提示更新

安卓实现APP自动检测软件版本并提示更新

前言

当我们在做安卓项目的时候,客户的需求往往难免会发生变动。但是我们的产品已经上线了,却又需要修改的话我们该怎么办呢?也许很多应用商店已经集成了这个功能,只需要开发者上传新的APK文件即可,应用商店会自动进行提醒用户进行应用更新。可是对于那些因可能不想写申请著作权相关的文件又或着产品急于上线而无法上线到应用商店的APP又该怎么办呢?(这里提一句:绝大多数应用商店在开发者发布应用的时候需要提供软件的著作权,而申请软著则需要写一些相关的文件,然后提交上去之后还需要等待审核人员对材料进行审核,审核通过了才会给你发软件的著作权,但是这个审核期通常要大约一个月)没办法,就只能靠我们自己实现。其实自己实现也不是特别难。接下来我们来看如何对其进行实现吧。


效果图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Tips:这里只改了服务器中的版本号而已,并没有放新的APK上去,所以图中显示的是 版本 1.0.1 → 1.0.1

在这里插入图片描述


实现思路
其实实现的思路很简单,就是在打开APP的时候首先从服务器中去获取保存的版本号,然后再获取软件本身的版本号并与服务器版本号进行比较,若相同,则不做任何事,若不相同,则弹出版本更新的提示框去提示用户进行更新。用户如果点击更新则软件就去放在服务器中的APK资源,下载完毕后进行安装,这样我们就完成了软件的自动检测版本更新功能。

准备事项
① 服务器数据库中保存服务器中的软件版本号。
② 返回服务器数据库中版本号的后台接口。
③ 服务器中tomcat中放入软件的APK文件。
④ APP获取软件本身版本号以及弹出版本更新弹窗并下载服务器中APK文件功能。
接下来我们来一一实现

① 数据库保存版本号

相信这个对于绝大多数人来说并不难,直接在数据库中创建一个表和一个字段即可。这里放下我自己创建的数据库表供大家参考。

在这里插入图片描述


② 返回服务器数据库中版本号的后台接口

这个对于Java程序员来说简直是易容反掌。就是返回服务器版本号Json数据的Servlet而已。相信对于大多数人来说也不难。这里也就不再详细说明了。


③ 服务器中tomcat中放入软件的APK文件

这里的意思就是大家要把更新时所需的APK资源给用户准备好,以便用户在进行更新的时候能够访问并下载到最新版本的APK文件供用户安装。这里只需要大家把最新版本的APK文件放在服务器的tomcat的如下路径(Tomacat/webapps/ROOT)下即可访问地址为:服务器地址 + / + apk文件名,如图中的地址为:http://183.66.246.214:9420/BluetoothSPP.apk
Tips:当用户访问该网址,即可进行下载该APK文件。

在这里插入图片描述


④ APP获取软件本身版本号以及弹出版本更新弹窗并下载服务器中APK文件功能。
【1】APP获取软件本身版本号

不知道大家在写安卓软件的时候有没有注意到在项目的build.gradle文件中就包含着该项目的版本号以及版本名的内容。如下图所示:

在这里插入图片描述
在这里插入图片描述

既然软件自身的版本号以及版本名都已经知道在哪里了,那么接下来的任务就是获取到它就行了。
    //获取软件版本号
    public String getVersionCode(Context context)
    {
        try {
            String pkName = context.getPackageName();
            String versionName = context.getPackageManager().getPackageInfo(
                    pkName, 0).versionName;
            int versionCode = context.getPackageManager().getPackageInfo(
                    pkName, 0).versionCode;
            return "V" + versionCode + "_" + versionName;
        }
        catch (Exception e)
        {
            Log.d(TAG, "getVersionCode: " + e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

【2】弹出版本更新弹窗并下载服务器中APK文件

这个功能相比上一个获取版本号的功能来说相对复杂一点,但实现的不是太难。首先弹出提示窗,这个重写一下AlertDialog就能实现。并且能够制定自己想要的弹出界面。接着就是下载服务器中的APK文件,这个也不是很难,直接用一个服务(Server)进行下载即可。其实呢,这两个功能是有一些大佬早已集成在了一起,界面和功能呢也做的很成熟稳定了。所以这里我们不妨直接使用这些大佬已经弄好的接口来进行实现,这样既稳定又便捷。 在这里要感谢提供这一接口的大佬,大佬的gitHub项目地址 → 传送门
注意:大家需要详细阅读项目下的README.md文件内容来进行使用,这样才不会出错。

我是用的java版本的,下面给出我这部分的核心代码。
  //获取服务器保存的版本号
    public void GetServerVersionInfo()
    {
        new Thread(new Runnable() {
            @Override
            public void run() {
            //通过访问后台接口来获取保存在数据库中的版本号内容
            //将返回的json数据解析出来并进行判断处理
                try {
                    OkHttpClient client = new OkHttpClient();
                    RequestBody requestBody = new FormBody.Builder()
                            .build();
                    Request request = new Request.Builder()
                            .url("http://183.66.246.214:9420/cloundctrl/user/getSoftware2")
                            .post(requestBody)
                            .build();
                    Response response = client.newCall(request).execute();
                    String responseData = response.body().string();
                    JSONObject jsonObject = new JSONObject(responseData);
                    //获取到返回的状态值 json数据的code项
                    String code = jsonObject.getString("code");
                    Log.d(TAG, "run: code的值为: " + code);
                    if(code.equals("200"))
                    {
                        String data = jsonObject.getString("data");
                        JSONObject dataJsonObject = new JSONObject(data);
                        Log.d(TAG, "run: data为 " + data);
                        String id = dataJsonObject.getString("id");
                        Log.d(TAG, "run: id为 " + id);
                        String versionCode = dataJsonObject.getString("versionCode");
                        Log.d(TAG, "run: versionCode为" + versionCode);
                        String versionName = dataJsonObject.getString("versionName");
                        Log.d(TAG, "run: versionName为 " + versionName);

                        //获取到本身的apkVersionCode和apkVersionName
                        String versionInfo = getVersionCode(MainActivity.this);
                        String serverVersionInfo = "V" + versionCode + "_" + versionName;
                        //如果俩不相等则进行提示升级
                        if(!versionInfo.equals(serverVersionInfo))
                        {
                            VarsOfUpdate.setUpdateTitle("发现新版本V" + versionName);
                            VarsOfUpdate.setVersionName("V" +versionName);

                            //进行升级
                            UpdateConfig updateConfig1 = new UpdateConfig();
                            updateConfig1.setCheckWifi(true);
                            updateConfig1.setNotifyImgRes(R.drawable.ic_update_logo);
                            //是否强制更新(取出取消更新按钮)
                            //updateConfig.setForce(true);
                            updateConfig1.setAlwaysShowDownLoadDialog(true);

                            UiConfig uiConfig1 = new UiConfig();
                            uiConfig1.setUiType(UiType.CUSTOM);
                            uiConfig1.setCustomLayoutId(R.layout.view_update_dialog_custom);

                            Log.d(TAG, "onClick: 运行到了这里!");
                            UpdateAppUtils
                                    .getInstance()
                                    .apkUrl(VarsOfUpdate.getApkUrl())
                                    .updateConfig(updateConfig1)
                                    .uiConfig(uiConfig1)
                                    .setOnInitUiListener(new OnInitUiListener() {
                                        @Override
                                        public void onInitUpdateUi(View view, UpdateConfig updateConfig, final UiConfig uiConfig) {
                                            TextView tv_updateTitle;
                                            TextView tv_versionName;
                                            TextView tv_updateContent;

                                            TextView btn_updateSure;

                                            ImageView imageView_updateCancel;

                                            tv_updateTitle = (TextView)view.findViewById(R.id.tv_update_title);
                                            tv_versionName = (TextView)view.findViewById(R.id.tv_version_name);
                                            tv_updateContent = (TextView)view.findViewById(R.id.tv_update_content);

//                                            public static String apkUrl = "http://183.66.246.214:9420/BluetoothSPP.apk";
//
//                                            public static String updateTitle = "发现新版本V1.0.0";
//                                            //更新内容
//                                            public static String updateContent = "1、控制更加智能\n2、参数一目了然\n3、在线升级不是问题\n4、更多功能等你探索";
//                                            //更新版本名称
//                                            public static String versionName = "1.0.0";

                                            tv_updateTitle.setText(VarsOfUpdate.getUpdateTitle());
                                            tv_versionName.setText(VarsOfUpdate.getVersionName());
                                            tv_updateContent.setText(VarsOfUpdate.getUpdateContent());
                                        }
                                    })
                                    .update();
                        }
                    }
                }catch (Exception e)
                {
                    e.printStackTrace();
                    Log.d(TAG, "run: 错误信息为 :" + e.getMessage());
                    //Toast.makeText(MainActivity.this,"网络异常,检查软件更新失败!", Toast.LENGTH_SHORT).show();
                }
            }
        }).start();
    }


最后
提醒大家一定要在项目的AndroidManifest.xml文件下加入如下用户权限
<uses-permission android:name="android.permission.INTERNET" />
以下是相关类库
 //更新APP库
    implementation 'com.teprinciple:updateapputils:2.3.0'
    //AndroidX
    //implementation 'com.teprinciple:updateapputilsx:2.3.0'

//访问互联网需要的库
    implementation 'com.squareup.okhttp3:okhttp:4.5.0'
以下是我图中的图标(感谢大佬Dome下提供的图标)
bg_custom_update_dialog.png

在这里插入图片描述

bg_custom_update_dialog.9.png

在这里插入图片描述

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现Android app的自动更新,可以按照以下步骤进行操作: 1. 首先,需要检测当前应用是否是最新版本。可以通过解析服务器返回的数据来获取最新版本的信息。在解析数据时,可以获取到最新版本版本号、版本名称、更新内容等。 2. 如果检测到有新版本可用,就需要下载新版本的apk文件。可以使用RxJava和Retrofit等库来处理下载任务。通过创建一个Observable对象来实现下载并监听下载进度。在下载过程中,可以使用进度条来显示下载进度,并将进度以百分比的形式显示在界面上。 3. 在下载过程中,还需要重写onError()和onComplete()方法来处理下载过程中的异常情况。例如,网络异常或服务器异常等情况都需要给用户相应的提示。 4. 下载完成后,需要将下载的apk文件保存至本地。可以使用Android系统提供的权限来获取外部存储的读写权限。 5. 完成以上步骤后,就可以提示用户安装新版本的apk文件。可以使用系统的安装器来安装apk文件,并通过Intent来启动安装过程。 通过以上步骤,就可以实现Android app的自动更新功能。需要注意的是,为了保证用户的数据安全,下载的apk文件需要进行校验。可以使用MD5算法来计算apk文件的MD5值,并与服务器返回的MD5值进行比较,确保下载的apk文件完整性。 以上是一个简要的实现自动更新功能的步骤,具体的实现方式还需要根据具体的项目需求和技术选择来确定。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值