Android实现APP在线下载更新

uniapp安卓APP在线更新实战:5分钟搞定蒲公英平台集成 本文详细介绍了如何在UniApp开发的安卓APP中,快速集成蒲公英平台实现应用内在线更新功能。通过对比自建更新服务器的成本与效率,文章提供了从平台配置、获取API密钥到编写健壮更新逻辑的完整实战指南,帮助中小团队和个人开发者轻松实现实时在线更新,提升用户体验并降低维护成本。 阅读详情
前言

项目地址:https://github.com/teprinciple/UpdateAppDemo
现在的android应用app会隔一段时间发布一个新的版本,当你打开某个app,如果有最新的版本,会提醒你是否下载更新。本文利用android自带的下载管理器DownloadManager进行下载最新版本的apk,下载完成后自动跳转安装。效果如下:



第一步、检查版本并判断是否需要更新

通过获取当前app版本号与服务器上的版本号进行对比,如果本地的版本号低于服务器版本号,则弹出提示框:发现新版本,是否下载更新。

/**
 * Created by Teprinciple on 2016/11/15.
 */
public class UpdateAppUtil {

    /**
     * 获取当前apk的版本号 currentVersionCode
     * @param ctx
     * @return
     */
    public static int getAPPLocalVersion(Context ctx) {
        int currentVersionCode = 0;
        PackageManager manager = ctx.getPackageManager();
        try {
            PackageInfo info = manager.getPackageInfo(ctx.getPackageName(), 0);
            String appVersionName = info.versionName; // 版本名
            currentVersionCode = info.versionCode; // 版本号
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return currentVersionCode;
    }

    /**
     * 获取服务器上版本信息
     * @param context
     * @param callBack
     */
    public static void getAPPServerVersion(Context context, final VersionCallBack callBack){

        HttpUtil.getObject(Api.GETVERSION.mapClear().addBody(), VersionInfo.class, new HttpUtil.ObjectCallback() {
            @Override
            public void result(boolean b, @Nullable Object obj) {
                if (b){
                        callBack.callBack((VersionInfo) obj);
                }
            }
        });
    }

    /**
     * 判断版本号,更新APP
     * @param context
     */
    public static void updateApp(final Context context){
        getAPPServerVersion(context, new VersionCallBack() {
            @Override
            public void callBack(final VersionInfo info) {
                if (info != null && info.getVersionCode()!=null){

                    Log.i("this","版本信息:当前"+getAPPLocalVersion(context)+",服务器:"+Integer.valueOf(info.getVersionCode()));

                    if (Integer.valueOf(info.getVersionCode()) > getAPPLocalVersion(context)){
                        ConfirmDialog dialog = new ConfirmDialog(context, new lht.wangtong.gowin120.doctor.views.feature.Callback() {
                            @Override
                            public void callback() {
                                DownloadAppUtils.downloadForAutoInstall(context, Api.HOST_IMG+info.getLoadPath(), "demo.apk", "更新demo");
                            }
                        });
                        dialog .setContent("发现新版本:"+info.getVersionNumber()+"\n是否下载更新?");
                        dialog.setCancelable(false);
                        dialog .show();
                    }
                }
            }
        });
    }

    public interface VersionCallBack{
        void callBack(VersionInfo info);
    }

}
第二步、下载最新版apk

通过Android自带的DownloadManager下载管理器,下载服务器上最新版的apk。下载完成后会发送下载完成的广播。

/**
 * Created by Teprinciple on 2016/11/15.
 */
public class DownloadAppUtils {
    private static final String TAG = DownloadAppUtils.class.getSimpleName();
    public static long downloadUpdateApkId = -1;//下载更新Apk 下载任务对应的Id
    public static String downloadUpdateApkFilePath;//下载更新Apk 文件路径

    /**
     * 通过浏览器下载APK包
     * @param context
     * @param url
     */
    public static void downloadForWebView(Context context, String url) {
        Uri uri = Uri.parse(url);
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(Uri.fromFile(new File(Environment
                        .getExternalStorageDirectory(), "tmp.apk")),
                "application/vnd.android.package-archive");
        context.startActivity(intent);
    }


    /**
     * 下载更新apk包
     * 权限:1,<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
     * @param context
     * @param url
     */
    public static void downloadForAutoInstall(Context context, String url, String fileName, String title) {
        //LogUtil.e("App 下载 url="+url+",fileName="+fileName+",title="+title);
        if (TextUtils.isEmpty(url)) {
            return;
        }
        try {
            Uri uri = Uri.parse(url);
            DownloadManager downloadManager = (DownloadManager) context
                    .getSystemService(Context.DOWNLOAD_SERVICE);
            DownloadManager.Request request = new DownloadManager.Request(uri);
            //在通知栏中显示
            request.setVisibleInDownloadsUi(true);
            request.setTitle(title);
            String filePath = null;
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//外部存储卡
                filePath = Environment.getExternalStorageDirectory().getAbsolutePath();

            } else {
                T.showShort(context, R.string.download_sdcard_error);
                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();
            downloadForWebView(context, url);
        }
    }


    private static boolean deleteFile(String fileStr) {
        File file = new File(fileStr);
        return file.delete();
    }
}

注意添加权限:

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
第三步、下载完成后跳转安装

通过广播接收者,接收到下载完成后发出的广播,跳转到系统的安装界面,进行安装。

/**
 * Created by Teprinciple on 2016/11/15.
 */
public class UpdateAppReceiver extends BroadcastReceiver {
    public UpdateAppReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理下载完成
        Cursor c=null;
        try {
            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())) {
                if (DownloadAppUtils.downloadUpdateApkId >= 0) {
                    long downloadId = DownloadAppUtils.downloadUpdateApkId;
                    DownloadManager.Query query = new DownloadManager.Query();
                    query.setFilterById(downloadId);
                    DownloadManager downloadManager = (DownloadManager) context
                            .getSystemService(Context.DOWNLOAD_SERVICE);
                    c = downloadManager.query(query);
                    if (c.moveToFirst()) {
                        int status = c.getInt(c
                                .getColumnIndex(DownloadManager.COLUMN_STATUS));
                        if (status == DownloadManager.STATUS_FAILED) {
                            downloadManager.remove(downloadId);

                        } else if (status == DownloadManager.STATUS_SUCCESSFUL) {
                            if (DownloadAppUtils.downloadUpdateApkFilePath != null) {
                                Intent i = new Intent(Intent.ACTION_VIEW);
                                i.setDataAndType(
                                        Uri.parse("file://"
                                                + DownloadAppUtils.downloadUpdateApkFilePath),
                                        "application/vnd.android.package-archive");
                                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                context.startActivity(i);
                            }
                        }
                    }
                }
            }/* else if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(intent.getAction())) {//点击通知取消下载
                DownloadManager downloadManager = (DownloadManager) context
                        .getSystemService(Context.DOWNLOAD_SERVICE);
                long[] ids = intent.getLongArrayExtra(DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS);
                //点击通知栏取消下载
                downloadManager.remove(ids);
            }*/

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (c != null) {
                c.close();
            }
        }
    }
}

注意需要在AndroidMainfest.xml中注册receiver:

<receiver android:name=".updateapp.UpdateAppReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
                <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"/>
            </intent-filter>
</receiver>

通过上面三步就可以快速实现APP的在线更新 。
项目地址:https://github.com/teprinciple/UpdateAppDemo

RecycleBinEmpty.gif_1.tmp RecycleBinEmpty.gif_1.tmp loadrunner11 安装缺失文件 立即下载

相关推荐

Android实现APP自动更新功能

主要为大家详细介绍了Android实现APP自动更新功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

APK安装过程及原理详解

来自华为内部资料  PackageInstaller 原理简述   应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作。APK是Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。   And...

737

Proteus仿真实战:用STM32F103C8T6输入捕获模式精准测量PWM频率(附完整代码)

本文详细解析了如何在Proteus仿真环境中,利用STM32F103C8T6的输入捕获模式精准测量PWM频率。文章从输入捕获的工作原理、Proteus电路搭建、模块化代码实现到调试优化,提供了完整的实战指南和代码示例,帮助开发者深入理解并掌握这一关键技术。

weixin_29158047的博客 256

adb 命令 之apk相关

安装 APK 命令格式: adb install [-lrtsdg] &lt;path_to_apk&gt; 参数: adb install 后面可以跟一些可选参数来控制安装 APK 的行为,可用参数及含义如下: 参数 含义 -l 将应用安装到保护目录 /mnt/asec -r 允许覆盖安装 -t 允许安装 AndroidManifest.xml 里...

houxian1103的博客 1658

Ubuntu中交叉编译armadillo库

网上关于交叉编译armdillo库比较少,借鉴了一些但是在前几天编译时总是磕磕绊绊,于是写一个详细的编译过程。交叉编译armdillo库包含两个步骤:交叉编译依赖库和交叉编译armdillo库。

weixin_39813867的博客 1879

HTB Attacking GraphQL Skills Assessment

通过枚举应用,利用GraphQL API,发现sql注入点,然后利用找到flag。

qq_33522010的博客 452

Android学习系列(19)--App离线下载

宜未雨而绸缪,毋临渴而掘井。----朱用纯《治家格言》 离线下载,在有网络的情况下下载服务器数据,以便无网络时也能阅读,就是离线阅读。 离线下载的功能点如下: 1.下载管理(开始、取消下载)。 2.网络判断(Wi-Fi,3G)。 3.独立进程。 4.定时和手机催醒。 5.自启动。 1.下载管理...

dianan1505的博客 225

VFIO框架源码分析(二十一)- IOMMUFD 模式下的 DMA 映射机制

在虚拟化 I/O 的世界里,无论上层管理面(如对象模型、设备绑定)如何重构,数据面最核心的任务始终未变——DMA 映射(DMA Mapping)。即如何建立 Guest Physical Address (GPA) 到 Host Physical Address (HPA) 的映射关系,并将其填入 IOMMU 的硬件页表中,使得直通设备能够正确访问虚拟机内存。在 Legacy VFIO (Type1) 时代,这一职责由承担,它通过ioctl 操作 Container。

qq_36071928的博客 1007

android服务下载apk下载地址,android 从服务器上获取APK并下载安装

简单的为新手做个分享。 网上有些资料,不过都是很零散,或是很乱的,有的人说看不懂。一直有新手说 做到服务器更新APK时没有思路,这里做个简单的分享,希望有不同思路的可以讨论。下面做个很简单的读取处理和讲解思路。代码带有注释:try {URL url = new URL(params[0]);HttpURLConnection connection = (HttpURLConnection) ...

weixin_35520787的博客 4609

保姆级教程:在Ubuntu 22.04上从零安装SUMO并运行第一个交通仿真

本教程详细介绍了在Ubuntu 22.04系统上从零安装SUMO交通仿真软件并运行第一个仿真的完整流程。涵盖环境准备、PPA源安装、核心组件验证、首次仿真案例运行以及进阶配置技巧,特别针对netedit路网编辑器和地图格式转换等实用工具进行重点讲解,帮助用户快速掌握SUMO在交通仿真领域的应用。

weixin_30546189的博客 420

【大语言模型 21】语言模型训练目标:MLM vs CLM vs GLM对比分析

本文深入对比分析三种主流语言模型训练目标:掩码语言模型(MLM)、因果语言模型(CLM)和双空白填充(GLM)。通过数学推导、代码实现和实验对比,揭示不同训练目标的工作机制、适用场景和性能差异,为选择合适的预训练策略提供科学指导。

熵数实验室 1173

android+app+free+download,Powerful and Efficient free android app download - Alibaba.com

1/5$18.00-$30.00/ Piece5 Pieces(Min. Order)Amlogic S905W Mini X96 Android 7.1 internet smart tv box android game player free games app download 802.11n 2.4 ghz wifi and cheapest android tv box 4 k sup...

weixin_42640271的博客 1574

YOLO11改进 | 卷积模块 | 轻量化GSConv替换普通的conv

yolo11,GSConv,卷积模块

kay_545 3955

android app更新管理,Android实现APP在线下载更新

Android实现APP在线下载更新发布时间:2020-09-01 22:54:06来源:脚本之家阅读:217作者:ChatHello前言项目地址:UpdateAppDemo现在的android应用app会隔一段时间发布一个新的版本,当你打开某个app,如果有最新的版本,会提醒你是否下载更新。本文利用android自带的下载管理器DownloadManager进行下载最新版本的apk,下载完成后自...

weixin_33823399的博客 1125

黑猫带你学eMMC协议第22篇:emmc可靠写详解(Write Reliability)

1 前言 1.1 声明 本文依据eMMC JEDEC5.1、网络资料及个人工作经验整理而成,如有部分错误请留言。 本文部分内容可能源自网络,侵删。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 1、什么是可靠性写属性(Write Reliability)? 2、可靠写和普通的写有什么区别? 3、设置可靠写的流程及流程框图。 4、可靠写需要遵循哪些规则? 1.3 参考链接 本文主要参考链接:http://www.up48.com/cn/support/8_37.html 2 什么

黑猫奥利奥的博客 3119

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android 通过蒲公英pgyer的接口 Service 实现带进度下载App 通知栏显示 在线更新 自动更新Demo

Android 通过蒲公英pgyer的接口 Service 实现带进度下载App 通知栏显示 在线更新 自动更新Demo 标签: app在线更新下载Update升级 2016-09-18 20:47 883人阅读 评论(2) 收藏 举报  分类: android(152)  版权声明:本文为【LouisGeek】原创文章,转载请注明出处!

王人冉的博客 4313

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android app 内部在线升级

app在线更新是一个比较常见需求,新版本发布时,进入app,会弹出更新提示框,第一时间更新新版本app。在线更新分为以下几个步骤: 1.请求api 2.检查版本 3.下载最新版本apk 4.安装apk 下载apk如下: // mUpgradeAddress:下载apk的地址,size: apk的大小 private void downloadAPK(String mUpgradeAddress,int size) { try { UR.

why_111的博客 3268

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

安卓apk在线更新

安卓apk在线更新比对版本弹出更新弹框DownloadAppUtilsapk下载后 比对版本 public void compareVersion() { String pkName = this.getPackageName(); String versionName = null; try { //获取apk版本名 ...

weixin_42272544的博客 1365

Android—App在线更新后不会自启动解决办法!

做项目的时候,公司要求自己写App在线自动检测更新,App启动是的flash界面也就是欢迎界面开始检测版本,不一样就下载; 在这里就出现一个问题,下载完了就开始安装替换,替换完了,程序没启动!但是,如果我进入其他Acitivity,然后子线程还在下载,那么下载完了还能自启动;所以就干脆在当前Activity下载,下载完了finish就可以了。如蓝色字体的代码 builder.setPo

weiguishan的专栏 3163

delphi android 升级,Delphi XE7 android 实现的在线更新APP的一个程序

本文章介绍了DelphiXE7实现的在线更新APP的一个程序,该程序通过IDHTTP组件在线下载APP到手机中,然后自动安装这个APP程序。程序首先点击DownLoadAPP按钮,实现在线下载APP程序procedureTForm1.Button2Click(Sender:TObject);varcaminho_d:string;MyFile:TFileStream;begin//ve...

weixin_39665992的博客 333

UpdateAppUtils一行代码实现app在线更新

UpdateAppUtils 一行代码,快速实现app在线下载更新A simple library for Android update app 先看效果图:   update.gif 快速使用 先来看看怎样一行代码实现更新: dependencies { compile 'com.teprinciple:updateapputils:1.4' } UpdateAp...

Roshen博客 8315

PHP安卓苹果APP在线封装打包制作源码 H5手机网站转APP 免签封装绿标

简介: PHP安卓苹果APP在线封装打包制作源码 H5手机网站转APP 免签封装绿标 更新记录: 1.解决ios无法下载的问题 2.优化打包流程 修复原先各种问题 3.可自行上传安卓证书 4.可自行上传启动图 5.解决ios全屏问题兼容ios14 6.修复原先乱七八糟的代码原先一百多兆 优化后四十多兆 7.去除权限解决某些手机报毒 8.安卓返回退出(请查看帮助文档) 9.完善api功能 可api请求打包 网盘下载地址: http://kekewl.org/HESd0so2WCO0 图片: ...

banzhuan678的博客 1491

转载 Teprinciple UpdateAppUtils一行代码实现app在线更新

UpdateAppUtils一行代码实现app在线更新  Teprinciple 关注 2017.08.11 14:58* 字数 692 阅读 6228评论 27喜欢 79 UpdateAppUtils 已适配Android6.0、7.0、8.0 一行代码,快速实现app在线下载更新A simple library for Android update app 先看效果图:   u...

Young_penis的博客 1572
上一篇: Android WebView顶部进度条
下一篇: 关于APP自动更新那点事
ChatHello
博客等级 码龄11年 43粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值