安卓实现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() {@Overridepublic 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和apkVersionNameString 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() {@Overridepublic 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

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

  1. 微信小程序自动检测版本并提示更新新版本

    微信小程序自动检测版本并提示更新新版本 微信小程序开发过程中,我们在版本更新迭代后,微信小程序客户端并不能触发自动更新,需要用户手动清理小程序后重新搜索进入后才能获取到最新的小程序版本,但是这个是用户 ...

  2. uniapp实现app自动检测更新

    实现检测版本更新并下载新版本:通过后台返回更新版本的版本号和当前版本号做比较,不同则提示有新版本需要更新,下载地址又后台返回 代码: // 检测版本更新async checkUpdates() {// ...

  3. 安装软件时,提示更新设备解决办法

    1.问题描述: 安装软件时提示:若要继续接收应用建议,请立即更新.即使点击"立即更新"完毕后,双击软件安装包,还是会弹出这个提示. 2.问题背景: 我的电脑系统是win10企业版, ...

  4. 微信小程序用户自动检测最新版本并更新2020年最新版亲测

    微信小程序新版本发布之后,用户使用依然是旧版本,这是因为在微信中有旧版本的缓存,不会及时更新到新版本.要想让用户更新到新版本,可以通过提示用户在微信中的"发现 - 小程序"入口中将 ...

  5. 微信域名拦截自动检测软件

    微信域名防封加密的作用? 落地域名多层加密使用,减少域名的浪费和被封杀:保护原始推广落地页不容易被举报和发现,延长原始推广落地页寿命:中间落地域名被封只需重新更换,不影响防封短链接的打开,减少流量浪费 ...

  6. android 发布动态功能,Gate.io发布安卓手机APP 2.6.5 beta版本,新增动态短视频功能...

    Gate.io发布安卓手机APP 2.6.5beta版本,APP内"发动态"增加短视频功能,最长视频2分钟.同时为实盘增加操作历史分页,优化动态显示,修复bug等.我们将持续为用户 ...

  7. ati显卡故障测试软件,amd显卡自动检测

    amd显卡自动检测工具是功能比较强大的adm检测工具,功能比较的全面,能够显示出显卡的型号和类型,保证用户对自己的显卡了解的更清楚,操作起来也比较的简单好上手~感兴趣的朋友快来体验吧! amd显卡自动 ...

  8. android raw相机,最高大上的安卓相机App?专业拍摄ProShot

    安卓棒棒糖有一个非常重要的改进--第三方App可以调用更多的摄像头API,这令第三方App能够拍摄RAW照片,并且对一系列拍摄参数进行细调.不过,要发挥这些专业向的新特性,自然也得配上相应的App.配 ...

  9. Mac如何允许安装非App Store的软件

    http://jingyan.baidu.com/article/09ea3ede2d2b80c0afde394d.html http://jingyan.baidu.com/article/09ea ...

最新文章

  1. 七基于Fourinone实现MQ demo
  2. telnet 如何退出
  3. 格雷码编码+解码+实现(Python)
  4. 十年SNS社区产品:近乎 V5.0-V5.2安装及问题解决思路
  5. 在Java Build Path中找不到超类“javax.servlet.http.HttpServlet”[重复]
  6. thinkpad t400无线网卡故障恢复技巧
  7. mysql sql应用_MySQL数据库应用(5)SQL语言(2)
  8. Windows APC学习笔记(一)—— APC的本质备用APC队列
  9. 规模估算失准 软件开发成空中楼阁
  10. 鲲鹏服务器php性能,对鲲鹏服务器的内存进行性能优化后的前后数据对比
  11. 页面头部title、description、keywords标签的优化
  12. SPFieldLookupValue
  13. 2.14 加载Firefox配置
  14. ActiveMQ 即时通讯服务 浅析
  15. CorePlot-饼状体
  16. (转)Inno Setup入门(七)——提供安装语言选项
  17. 星云的Linux专用学习手册
  18. java类注释_Java注释,java类注释详解
  19. 【标准】ISO14001:2015新版标准正式发布
  20. 输出纹波和纹波电流测试规范分享

热门文章

  1. USB3.2超高速协议规范
  2. HashMap的四种同步方式
  3. (转载)适合大学生旅游时住的各地旅馆
  4. Vulnhub靶机系列:SecTalks: BNE0x03 - Simple
  5. 科学网肖波:海外博后申请的一点经验与看法
  6. 学编程需要什么基础?
  7. 用Leangoo管理用户故事
  8. 卫星遥感技术应用与农业干旱监测的研究进展
  9. 发力“智能马桶”的小米们,选对了目标群体吗?
  10. 基于f2从零实现移动端可视化编辑器