Android 内部更新 各安卓版本适配

一:前言

在国内,app在线更新是一个必须要求。新版本发布时。用户进入我们的app,就会弹出更新提示框;

二:开发

在线更新分为以下几个步骤:

1:通过接口获取线上版本号 versionCode;

2: 比较线上的versionCode 和当前的versionCode ,弹出更新窗口;

3:下载apk文件(其实就是文件下载);

4:安装apk文件;

end

1、2 步骤很简单 ;

3、4因为 Andriod各个版本权限和隐私的保护和收缩,因此3和4会有各种适配问题,那么今天就总结下app在线更新的适配处理。

二: apk下载

apk下载其实就是我们正常的文件下载。而文件下载有很多方式:

1:借助框架(okhttp等)

2:可以通过Android sdk 提供的下载类 DownloadManager。配置下配置就好;

备注:我自己项目用的是okhttp3;

下载apk:

下载过程中如果需要提示通知就记录进度;

下载好之后拷贝到沙盒存储里;

重头戏来了就是安装:(需要适配)

我这里主要以7.0 为中间界限 (用谷歌DownloadManager的要区分6.0以上和一下,获取到的uri会不一致 ,具体可参考:

https://www.cnblogs.com/gooder2-android/p/8966045.html)

安装的一些重要api:

Intent intent = new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setDataAndType(uri,      "application/vnd.android.package-archive");startActivity(intent);

我们看到 uri。此uri地址根据不同Android 版本进行不同处理拿到;

适配Android7.0 :访问文件做出了修改

在 Android 7.0 手机(访问文件做出了修改)

主要是:不能在使用file://格式的Uri 访问文件。Android 7.0对应提供了FileProvider 来获取apk地址,然后安装apk.

代码处理:

(1) 在res 目录下,新建一个xml 文件夹,在xml 下面创建一个文件provider_paths文件:

<?xml version="1.0" encoding="utf-8"?>
<paths><external-pathname="external"path="" /><external-files-pathname="Download"path="" />
</paths>
或:
我自己代码处理是:
<resources><paths><root-pathpath=""name="camera_photos" /></paths></resources><!--1、代表的根目录:Context.getFilesDir()2、代表的根目录:Context.getExternalFilesDir()3、代表的根目录:getCacheDir()4、上述代码中path="",是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了,如果你将path设为path=“pictures”,那么它代表着根目录下的pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享pictures目录范围之外的文件是不行的。-->

(2) 在AndroidManifest.xml清单文件中申明Provider:

 <provider//Androidx是: android:name="androidx.core.content.FileProvider"//support库是android:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:exported="false"android:grantUriPermissions="true"><!--1.android:exported:要求必须为false,为true则会报安全异常;2.android:grantUriPermissions:true,表示授予 URI 临时访问权限;3.android:authorities这个属性的值,建议写包名+fileprovider,当然也可以起别的字符串,但是在设备中不能出现2个及以上的APP使用到同一个authorities属性值,因为无法共存。--><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths" /></provider>

(3) Android 7.0上的文件地址获取:

//apkFile 是已经生成的文件
uri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID + ".fileprovider", apkFile);
适配Android 8.0:未知来源的应用权限

如果不适配有什么体验问题:

具体表现就是:apk下载完成,一闪而过,没有跳转到apk安装界面。经过排查,确定了是Android 8.0权限问题。

谷歌理由:Android8.0以上,未知来源的应用是不可以通过代码来执行安装的(在sd卡中找找到apk,手动安装是可以的),未知应用安装权限的开关被除掉,取而代之的是未知来源应用的管理列表,需要列表里面开启你的应用的未知来源的安装权限。Google这么做是为了防止一开始正经的应用后来开始通过升级来做一些不合法的事情,侵犯用户权益。

知道问题:开始适配:

1) 在清单文件中申明权限:REQUEST_INSTALL_PACKAGES

  <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

2)加flag:

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

亲测可以,搞定 搞定;

整体安装代码:

private void installApk(File apkFile) {if (!apkFile.exists())return;Intent intent = new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//7.0 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);uri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID + ".fileprovider", apkFile);} else {uri = Uri.fromFile(apkFile);}intent.setDataAndType(uri, "application/vnd.android.package-archive");startActivity(intent);
}

Android App内部更新(最新) 各安卓版本适配相关推荐

  1. android app实现更新功能

    功能演示 Android App自动更新基本上是每个App都需具备的功能.网上有各种更新方式,但基本都是往年的了,最近刚查资料写完一个app更新功能,发现了许多app更新的博客内没有详细说明的小问题, ...

  2. Android APP 自动更新实现(适用Android9.0)

    Android App自动更新基本上是每个App都需具备的功能,参考网上各种资料,自己整理了下,先来看看大致的界面: 一.实现思路: 1.发布Android App时,都会生成output-metad ...

  3. android通知栏应用程序更新,Android App自动更新之通知栏下载

    本文实例为大家分享了Android App自动更新通知栏下载的具体代码,供大家参考,具体内容如下 版本更新说明 这里有调用UpdateService启动服务检查下载安装包等 1. 文件下载,下完后写入 ...

  4. Android APP 快速开发教程(安卓)

    Android APP 快速开发教程(安卓) 前言 本篇博客从开发的角度来介绍如何开发一个Android App,需要说明一点是,这里只是提供一个如何开发一个app的思路,并不会介绍很多技术上的细节, ...

  5. Android App自动更新解决方案(DownloadManager)

    Android App自动更新解决方案(DownloadManager) 参考文章: (1)Android App自动更新解决方案(DownloadManager) (2)https://www.cn ...

  6. android app检测更新版本,《Android APP应该有的东西》之功能篇:版本检测更新

    <Android APP该有的东西>之功能篇:版本检测更新 自从友盟的自动更新下线之后,一大批app选择了自己写更新逻辑.是的,这里的逻辑并不复杂,完全可以自己写,但是不复杂不代表不麻烦, ...

  7. maven 强制更新_Android App内部更新Library的方法

    超详细!安卓巴士开发者大会嘉宾及主题介绍 AutoUpdateProject 最新版本及说明请关注GitHub,欢迎Star. 有什么意见与建议欢迎交流! github地址: https://gith ...

  8. Android APP热更新中的插件化(Hook技术:反射或动态代理),Demo (2)

    修改AAPT,资源分区,用于Android插件化- https://github.com/BaoBaoJianqiang/AAPT -- Android下的挂钩(hook)和代码注入(inject) ...

  9. android app 自动更新,AndroidUpdateDemo

    Android课程-App更新策略 @(Android) 第一节 课程介绍 概述 App更新是应用当中很常见的一个功能,基本上联网的app都应该具备这样的功能,对于更新迭代比较快速的产品,应用更新升级 ...

最新文章

  1. 云炬随笔20161223
  2. java 微信转账 ca_error_C#关于微信红包开发问题:CA证书出错,请登录微信支付商户平台下载证书...
  3. .net core 使用RSA获取私钥证书并签名
  4. java基准测试_星期五基准功能Java
  5. 庚顿数据:实时数据库赋能工业互联网
  6. eclipse中添加aptana插件(html.css.js自动提示)
  7. java synchronized 参数_java – 将参数传递给synchronized块的目的是什么?
  8. 组合与继承c++_组合与继承
  9. BZOJ 5106 [CodePlus2017]汀博尔
  10. 天猫轮播代码一秒美工万能淘宝轮播全屏轮播代码教程分享店铺装修全屏代码海报热点1920 居中显示圆点轮播海报
  11. 厦门大学2019年数学分析考研试题参考解答
  12. ubuntu系统打不开网易云音乐解决办法。
  13. spring cloud 微服务调用链
  14. 一些可以使用的网上图片地址
  15. arm linux vi键盘错乱,Ubuntu Server 18.04安装后vi命令解决键盘错乱方法和wifi连接之后不能上网...
  16. linux运行360wifi,Linux(Ubuntu)下的无线网络卡上的小米和360wifi教程
  17. 概率论复习笔记3.0--假设检验
  18. AutoCAD如何方便截图放到Word文档,改成白底黑字
  19. 关于group by的用法
  20. 小红书小程序x-sign加密算法解析

热门文章

  1. 2021年古城中学高考成绩查询,丽江古城第一高级中学2021年排名
  2. 华为手机维修点查询终于上线了
  3. 计算机无法访问dota服务器,如何解决Win10专业版玩dota2无法与任何服务器建立连接...
  4. “网络威慑力”是个危险的游戏
  5. 服务器系统日志保留多久,在Linux服务器上保留永久存储的系统日志(Systemd Journald)记录...
  6. android 下载zip文件并解压
  7. 社区/社群运营——《互联网运营的知识体系与整体逻辑》笔记(六)
  8. java mongo 去重_Mongodb去重查询
  9. Three.js教程:材质效果
  10. 重定向与转发的区别与应用