Android 自己实现更新下载自动安装
1、一些公司开发完一款App之后可能并不会去上架App商店,但事后期也需要定时进行维护更新,所以会选择把打包好的apk 发布到自己的服务器,然后在数据库建一个版本号的表,然后剩下的就交给你android开发了,android自己要实现版本检测更新,由于android自带的DownloadManager 就可以实现下载功能,用起来就会很简单了,不用再写很多下载等相关代码了,不过在下载完有的是在通知栏通知,然后用户自己手动点击进行安装,有的是下载完自己就进入安装状态了,用户只需要确认安装就可以了,但是由于一些高版本的系统和低版本的自动安装不同,这里就简单介绍一下,然大家能很快的处理这个事情,我就是在这个自动安装这块弄了有好几天不知道怎么回事,先总结一下:
2、这里就从开始下载开始,那些版本号的请求就不提了,,
这里我们可以先写一个工具类Util,然后顶一个静态方法downLoadApk();
eg:
/**
* 更新下载apk
* @param context 上下文对象
* @param title 程序的名字
* @param url 下载的url地址
*
*/
public static long downLoadApk(Context context,String title,String url){
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS,"ausee.apk");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
// 设置 Notification 信息
request.setTitle(title);
request.setDescription("下载完成后请点击打开");
request.setVisibleInDownloadsUi(true);
request.allowScanningByMediaScanner();
request.setMimeType("application/vnd.android.package-archive");
// 实例化DownloadManager 对象
DownloadManager downloadManager = (DownloadManager) MyApp.getContext().getSystemService(Context.DOWNLOAD_SERVICE);
final long refrence = downloadManager.enqueue(request);
return refrence;
}
上面的那个静态方法就可以实现下载了,把url传过去就OK了;下面就来处理剩下的,大家注意上面的方法会返回一个long类型的值,
大家在activity调用这个方法的时候,拿到这个返回值,然后在activity里面建一个广播接收器,因为上面的返回值是DownloadManager 下载完后返回的一个下载id,自带的,每一个下载任务都会返回一个唯一的id,并且会发一条广播,这里我在activity里面定义一个方法:listener(id),并建一个广播接受器; 如下
private void listener(final long Id) {
// 注册广播监听系统的下载完成事件。
IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
DownloadManager manager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
// 这里是通过下面这个方法获取下载的id,
long ID = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
// 这里把传递的id和广播中获取的id进行对比是不是我们下载apk的那个id,如果是的话,就开始获取这个下载的路径
if (ID == Id) {
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(Id);
Cursor cursor = manager.query(query);
if (cursor.moveToFirst()){
// 获取文件下载路径
String fileName = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
// 如果文件名不为空,说明文件已存在,则进行自动安装apk
if (fileName != null){
openAPK(fileName);
}
}
cursor.close();
}
}
};
registerReceiver(broadcastReceiver, intentFilter);
}
下面是上面的自动打开apk的方法:
/**
* 安装apk
* @param fileSavePath
*/
private void openAPK(String fileSavePath){
File file=new File(Uri.parse(fileSavePath).getPath());
String filePath = file.getAbsolutePath();
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0
// 生成文件的uri,,
// 注意 下面参数com.ausee.fileprovider 为apk的包名加上.fileprovider,
data = FileProvider.getUriForFile(LoginActivity.this, "com.ausee.fileprovider", new File(filePath));
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 给目标应用一个临时授权
} else {
data = Uri.fromFile(file);
}
intent.setDataAndType(data, "application/vnd.android.package-archive");
startActivity(intent);
}
上面基本就可以了,但是上面的那个参数com.ausee.fileprovider,这个需要注意,进行下面的配置
先在项目res文件下新建一个文件夹名字为 xml ;后新建一个xml的文件:file_paths.xml;
xml中内容为:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="name" path="."/>
</paths>
这里写好之后,下面在manifest里面配置一个provider标签:这么写就可以:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.ausee.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
仔细看上面的 android:authorities="com.ausee.fileprovider" (com.ausee为你自己的包名),这个内容和前面的那个参数一样的吧?就是因为这里,这里的内容也是那样填写的,包名加上一个fileprovider 就可以了,然后在meta-data 里面把刚开配置的xml文件配置进来就可以!
需要加个 android.intent.category.DEFAULT
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
好了,到这里就完工了,快去试试吧!
Android 自己实现更新下载自动安装的更多相关文章
- Android Studio和SDK下载、安装和环境变量配置
win10下Android Studio和SDK下载.安装和环境变量配置 - ...
- Android Studio 和 SDK 下载、安装和环境变量配置
转Android Studio 和 SDK 下载.安装和环境变量配置https://blog.csdn.net/hahahhahahahha123456/article/details/8065135 ...
- Android Studio3.0的下载及其安装详解加eclipse下载安装配置jdk9
关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 今天我们来讲解如何下载android studio 3.0及其 ...
- 解决Android SDK Manager 更新下载慢以及待安装包列表不显示
问题描述: Android SDK Manager 无法下载更新,或者更新速度超慢,或者待安装包列表不显示 解决方法: 第一步:修改hosts文件 修改后的hosts 文件内容为: 127.0.0.1 ...
- ubuntu14.04下 Android虚拟机 genymotion 的下载和安装
官网:https://www.genymotion.com/ Install Guide https://www.genymotion.com/#!/developers/user-guide#ins ...
- Android实现apk文件下载并自动安装
//下载apk程序代码 protected File downLoadFile(String httpUrl) { // TODO Auto-generated method stub final S ...
- Android sdk manager更新 下载API源码
方法一:在C:\Windows\System32\drivers\etc路径下的hosts文件中加入如下代码即可更新 203.208.46.146 www.google.com74.125.113.1 ...
- Android SDK代理服务器解决国内Android SDK不能更新下载问题
- redis官网下载自动安装脚本
注释:使用方法为 # ./redis.sh version ----version为官网版本号 #!/bin/bashversion=$1serverurl='download. ...
随机推荐
- React-router5.x 路由的使用及配置
在 React router 中通常使用的组件有三种: 路由组件(作为根组件): BrowserRouter(history模式) 和 HashRouter(hash模式) 路径匹配组件: Route ...
- Hibernate 5.x 生成 SessionFactory 源码跟踪分析
我们要使用 Hibernate 的功能,首先需要读取 Hibernate 的配置文件,根据配置启动 Hibernate ,然后创建 SessionFactory. 创建 SessionFactory ...
- mysql: show processlist 详解
最近排查一些MySQL的问题,会经常用到 show processlist,所以在这里把这个命令总结一下,做个备忘,以备不时只需. show processlist 是显示用户正在运行的线程,需要注意 ...
- Maven插件Jib配合Harbor生成Docker镜像
1 说明 Maven插件Jib暂不支持https的自签名,因此只能配置以Http的方式访问Harbor私有仓库 以下基于SpringBoot2.x进行配置 2 Maven配置 2.1 pom.xml中 ...
- Nginx 反向代理与负载均衡的配置
已经很久没有写博了,因为最近学车加上各种问题一直没时间, 今天刚好想起有好多的东西还没来得及记录.回到正题: Nginx是一个非常强大的web轻量级服务器,许多大厂也用Nginx进行负载均衡和反向代理 ...
- echarts路径图 绘制上海市52路公交车线路
busLines = [{"coords":[[121.494687,31.253937],[121.494276,31.254031],[121.494226,31.254042 ...
- 一个兼容IE7\IE8,H5的多功能视频播放器,H5视频播放器兼容Flash视频播放器
这里记录一个视频播放器,免费可适当修改:名称:ckplayer视频播放器(免费) 官网地址:http://www.ckplayer.com/ 下载地址:http://www.ckplayer.com/ ...
- php怎么实现多态?
在PHP5中,变量的类型是不确定的,一个变量可以指向任何类型的数值.字符串.对象.资源等.我们无法说PHP5中多态的是变量. 我们只能说在PHP5中,多态应用在方法参数的类型提示位置. 一个类的任何子 ...
- python基础语法6 名称空间与作用域
目录: 1.函数对象 2.函数嵌套 3.名称空间 4.作用域 函数是第一类对象 1.函数名是可以被引用: def index(): print('from index') a = index a() ...
- idea 将java导出为可执行jar及导入jar依赖
使用maven可以很好的帮助我们进行依赖的管理,也可以使用maven的jar包打包插件构建出可运行的jar.那针对不是用maven进行管理的普通java项目,可以通过以下方式导出可执行的jar包以及导 ...