【Android】轻松实现 APK 在线升级

article/2025/8/29 19:43:31

【Android】轻松实现 APK 在线升级

APK 在线升级

APK 在线升级几乎是所有程序必备的功能。

在线升级功能能解决已有的问题并提供更丰富的新功能。

基本的流程是:

  1. 检测到新版本信息
  2. 弹出升级提示窗口
  3. 点击 No 不进行升级,完毕!
  4. 点击 Yes 后台下载升级程序
  5. 程序下载完成进入安装页面
  6. 安装成功,进入新程序

下面将介绍使用 UpdateAppUtil 实现在线升级功能

0. 需要权限

需要授权 android.permission.INTERNETandroid.permission.WRITE_EXTERNAL_STORAGE 权限,具体申请版本在这里不展开了。

有兴趣的小伙伴可以看以往的文章。

1. 获取新版本信息

一般是访问服务器,获取新版本信息(以下面为例)


{"url":"https://www.google.com/test/a670ef11/apk/test.apk","versionCode":1,"versionName":"v2.1.0","create_time":"2019-12-14 03:44:34","description":"新增卫星链路,支持全球访问。"
}

必须要有 APK 的下载链接(url),版本号(versionCode)或者版本名(versionName)。

都是接下来需要用到的。

2. 设置信息


UpdateAppUtil.from(MainActivity.this).checkBy(UpdateAppUtil.CHECK_BY_VERSION_NAME) //更新检测方式,默认为VersionCode.serverVersionCode(0).serverVersionName(version).updateInfo(description).apkPath(url).update();

字段说明
checkBy是否需要弹出升级提示的依据。CHECK_BY_VERSION_NAME 是根据 serverVersionName 的不同就弹出升级提示。CHECK_BY_VERSION_CODE 是根据 serverVersionCode 高于当前软件版本弹出升级提示。
serverVersionCode设置新软件的 versionCode (如示例的 1 )
serverVersionName设置新软件的 versionName (如示例的 “v2.1.0” )
updateInfo升级提示窗口显示的新软件描述
apkPath新软件下载链接(需要通过此链接下载新软件)
update马上进行升级检查(如满足升级要求,弹出升级提示)
isForce如果不选择升级,直接退出程序

3. 下载升级程序

Android 有多种框架可以下载程序(okhttp等),也可以开启一个线程去下载(IntentService)。

而 UpdateAppUtil 采用 Android SDK 提供的下载框架 DownloadManager


public static void downloadWithAutoInstall(Context context, String url, String fileName, String notificationTitle, String descriptInfo) {if (TextUtils.isEmpty(url)) {Log.e(TAG, "url为空!!!!!");return;}try {Uri uri = Uri.parse(url);Log.i(TAG, String.valueOf(uri));DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);DownloadManager.Request request = new DownloadManager.Request(uri);// 在通知栏中显示request.setVisibleInDownloadsUi(true);request.setTitle(notificationTitle);request.setDescription(descriptInfo);request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);request.setMimeType("application/vnd.android.package-archive");String filePath = null;if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//SD卡是否正常挂载filePath = Environment.getExternalStorageDirectory().getAbsolutePath();} else {Log.i(TAG, "没有SD卡" + "filePath:" + context.getFilesDir().getAbsolutePath());return;}downloadUpdateApkFilePath = filePath + File.separator + fileName;// 若存在,则删除deleteFile(downloadUpdateApkFilePath);Uri fileUri = Uri.parse("file://" + downloadUpdateApkFilePath);request.setDestinationUri(fileUri);downloadUpdateApkId = downloadManager.enqueue(request);} catch (Exception e) {e.printStackTrace();}
}

request.setVisibleInDownloadsUi 下载UI显示到通知栏上

request.setTitle 设置通知栏的标题

request.setDescription 设置通知栏的消息

request.setNotificationVisibility 下载过程中一直显示下载信息,下载完后也存在(直到用户消除)

会清除没完成的文件,重新下载。

DownloadManager 下载过程中(下载完成)会发出广播,想要对下载完成进行处理需要监听广播。

(downloadUpdateApkFilePath 保存下载文件的路径,下载完成后可以通过此进行安装)

4. 进入安装

DownloadManager 下载完成后会发出 ACTION_DOWNLOAD_COMPLETE


public class UpdateAppReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Cursor cursor = null;try {if (! intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {return;}if (DownloadAppUtil.downloadUpdateApkId <= 0) {return;}long downloadId = DownloadAppUtil.downloadUpdateApkId;DownloadManager.Query query = new DownloadManager.Query();query.setFilterById(downloadId);DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);cursor = manager.query(query);if (cursor.moveToNext()) {int staus = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));if (staus == DownloadManager.STATUS_FAILED) {manager.remove(downloadId);} else if ((staus == DownloadManager.STATUS_SUCCESSFUL)&& (DownloadAppUtil.downloadUpdateApkFilePath != null)) {Intent it = new Intent(Intent.ACTION_VIEW);it.setDataAndType(Uri.parse("file://" + DownloadAppUtil.downloadUpdateApkFilePath),"application/vnd.android.package-archive");// todo 针对不同的手机 以及 sdk 版本, 这里的 uri 地址可能有所不同it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(it);}}} catch (Exception e) {e.printStackTrace();} finally {if (cursor != null) {cursor.close();}}}
}

判断是 DownloadManager.ACTION_DOWNLOAD_COMPLETE 获取 APK 路径进行安装。

下载提示

下载进度

安装页面

安装完成


http://chatgpt.dhexx.cn/article/lP34jU9f.shtml

相关文章

车载Linux固件升级,一种车载系统固件在线升级方法与流程

本发明涉及汽车系统升级技术领域,尤其涉及一种车载系统固件在线升级方法。 背景技术: 随着汽车智能化、网联化的发展趋势,车联网的技术进步带来汽车软件系统的复杂度不断增加,升级迭代的速度越来越快,软件的不稳定性风险不可避免。统计数据显示,当前市场一半以上的汽车召…

51单片机IAP在线升级

51单片机IAP在线升级 爱矽半导体E85F3325单片机IAP在线升级教程&#xff0c;此处可查看更新及demo下载 文章目录 前言一、ROM资源二、KEIL有关知识1.BL51连接器&#xff1a;2.LX51连接器&#xff1a; 三、Keil其他相关项说明&#xff1a;四、MCU启动文件说明&#xff1a;五、例…

在线升级版本:ESXI6.5升级7.0

将一台使用ESXI6.7的虚升级条件 1、首先确保硬件是否能升级到7.0版本&#xff0c;注意&#xff1a;物理网卡驱动为e1000e不能升级&#xff0c;如果是igbn&#xff0c;则可以顺利升级。拟机升级到了7.0版本。 升级方法 升级方法有补丁升级、在线升级和U盘升级三种方式&#xff0…

Ubuntu 如何 在线升级系统

Ubuntu 如何升级更新系统 有也常用 Kali Linux 的小伙伴会很熟悉&#xff0c;在Kali中我们只需要使用apt/apt-get包管理器执行如下命令即可&#xff1a; sudo apt update && apt upgrade -y一般执行结束就已完成Kali系统的更新或者再加上: sudo apt dist-upgrade -y&am…

跨平台应用开发进阶(三): uni-app 实现资源在线升级/热更新

文章目录 一、前言1.1 Android升级检测机制 二、wgt 资源升级包升级2.1 修改版本号2.2 发行2.3 安装资源升级包2.3.1 代码示例2.3.2 小结 三、整包升级3.1 客户端实现3.2 数据表实现3.3 服务端实现3.4 发版配置3.5 注意事项 四、Uni-app 版本升级中心4.1 升级中心 uni-upgrade-…

STM32 IAP 在线升级原理全解析

点击左上角的“关注”&#xff0c;定期更新 STM32 最新资讯&#xff0c;总有你想要的信息&#xff01; STM32 IAP 在线升级原理全解析 1. 什么是 IAP&#xff1f; IAP&#xff08;In-Application Programming&#xff09;是用户自己的程序在运行过程中对 User Flash 部分的区域…

ESP8266实现在线升级OTA

今天总结一下我实现ESP8266实现在线升级&#xff08;OTA&#xff09;的经验 关于理论介绍我这里不多讲&#xff0c;大家可以参考以下文章&#xff1a; 1.一个网友总结的经验&#xff08;我这篇文章主要也是对该文章做进一步补充&#xff09;&#xff1a;https://www.cnblogs.c…

stm32在线升级方案

目录 下载固件流程&#xff1a; Bootloader程序设计流程 普通工程改为APP工程的步骤 背景&#xff1a;当嵌入式软件需要固件升级时&#xff0c;有时需要拆卸设备&#xff0c;较为麻烦&#xff0c;为方便升级&#xff0c;提供远程升级的功能&#xff0c;可通过网络或其他通讯…

串口在线升级步骤

串口在线升级步骤 一、查看工程文件的Config.h 二、确定本地地址和目标地址 三、打开在线升级工具 四、配置串口参数 串口配置可以波查询代码与PC通讯的UART设置的参数。 五、填写本机地址和目标地址 本机地址为0xf3 243 主板目标地址为0xf5 245 PMT板目标地址为0x13 19 …

mariadb数据库在线升级版本

mariadb----在线版本升级 我之前的数据库版本号是5.5 一&#xff1a;备份数据库和数据库配置 mysqldump -u root -p --all-databases > /home/mydb.sql mv /etc/my.cnf /etc/my.cnf.bak 二&#xff1a;添加mariadb yum库 vim /etc/yum.repos.d/MariaDB.repo [mariadb] na…

FPGA远程固件在线升级

FPGA远程固件在线升级 1.摘要 对最近做的FPGA远程更新/在线升级做一个总结。一般在代码开发阶段&#xff0c;我们使用JTAG烧写代码&#xff0c;但当产品投入到实际使用过程中&#xff0c;难以再用JTAG进行固件更新。所以需要开发远程/在线更新的功能&#xff0c;即使用产品自…

固件在线升级流程

从事硬件开发&#xff0c;为了方便维护&#xff0c;免不了对模块进行固件升级&#xff0c;所以对于固件升级&#xff0c;简单整理了一下完整的在线升级的实现思路&#xff0c;该思路适用于所有带通讯总线的模块。 需要注意的是&#xff0c;需要额外的上位机配合。 下位机在线…

php 在线升级

php 在线升级 功能 目前已修改为通用解决方案 点击下方链接下载 此为最新优化过的版本 之后的贴图 说明 仅用来做思路参考 我就不再修改了 下面是思路解析思路一思路二升级程序服务器检测版本至此整个升级程序已经结束 感谢大家参考有任何问题都可以直接联系我咨询 一定不吝赐教…

软件在线升级系统设计

需求描述 一直用Qt开发PC版本的程序&#xff0c;常用的方法都是打包发布。目前开发的程序比较复杂&#xff0c;涉及到上百个独立的进程以及4000多个相关文件&#xff0c;采用原来的打包发布就变得很麻烦&#xff0c;第一改动比较频繁&#xff0c;打包次数过多&#xff1b;第二…

Nginx在线升级

1、查看当前nginx版本&#xff0c;nginx -v&#xff08;小写v&#xff09; 2、下载最新版本nginx包&#xff0c;nginx-1.23.1.tar.gz 3、解压tar -zxvf nginx-1.23.1.tar.gz 4、进入解压目录cd nginx-1.23.1.tar.gz 5、查看nginx当前配置&#xff0c;nginx -V注意这里是大写…

在线升级:OTA升级的原理和实现方式

目录 1、OTA 在线升级 2、实现方式 3、操作方式 3.1、后台式升级 3.2、非后台式式更新 4、STM32 的在线升级 4.1、划分 Flash 区域 4.2、实操1 - Flash空间地址的划分 4.3、实操2 - 设置工程 4.4、实操3 - 接收固件更新包 4.5、实操4 - 拷贝程序至Flash 4.6、实操5 - 跳转至 Ap…

halcon 彩色图转灰度图

read_image (Image, jiao1.bmp) //读取图像 get_image_size (Image, Width, Height) //获取宽高 dev_close_window () //关闭图形窗口 rgb1_to_gray (Image, GrayImage) //彩色图转灰度图 dev_open_window (0, 0, Width, Height, black, WindowHandle) //打开图形窗口 d…

Python中使用PIL快速实现灰度图

效果 原图 效果图 实现 新建文件夹grayImage&#xff0c;在此文件夹下新建gray.py from PIL import Image imgImage.open(1111.jpg) imgimg.convert(L) img.save(灰度图.jpg) 其中1111.jpg是原图&#xff0c;将其放在同目录下。 运行即可。 源码以及资源下载 https://do…

计算机灰度分析,计算机中的256级灰度图像

【建议1】使用GltraEdit软件观察字符“((Z20享有声望的学校联盟)”的内部代码. 以下说法正确 A. 字符“(”的内部代码占用两个字节 B. 字符“ Lian”的代码值的二进制表示形式是11010001 10101010 C. 图片中有5个ASCⅡ字符,其中字符“ 2”的代码值的十六进制表示为32 D. 字符“…

C++-灰度图上色GrayToColor

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 场景需求 最近有客户提出&#xff0c;想要将解包裹图像转化为有颜色的图像&#xff0c;具备更佳的视觉效果。解包裹图是一个floa…