原标题:Android app自动更新总结(已适配9.0)

1.配置:1.1 AndroidManifest.xml中添加权限和FileProvider:

--------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------

android:name="androidx.core.content.FileProvider"

android:authorities="com.fengzhi.wuyemanagement.fileprovider"

android:grantUriPermissions="true"

android:exported="false">

android:name="android.support.FILE_PROVIDER_PATHS"

android:resource="@xml/file_paths"/>

1.2 新建文件(路径:resxmlfile_paths.xml):

1.3 (app的)build.gradle:

implementation "com.lzy.net:okgo:3.0.4"//okgo 网络请求

implementation 'com.google.code.gson:gson:2.8.2'//gson

implementation "org.permissionsdispatcher:permissionsdispatcher:4.3.1"//权限

annotationProcessor "org.permissionsdispatcher:permissionsdispatcher-processor:4.3.1"//权限

2.这里以点击按钮进行更新为例:2.1 核心代码:

privateintversion;

/* 更新进度条 */

privateProgressBar mProgress;

privateAlertDialog mDownloadDialog;

--------------------------------------------------------------------------------------------------------------------

//点击按钮,检查权限,,,检查更新的方法

@NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE,

Manifest.permission.WRITE_EXTERNAL_STORAGE,

Manifest.permission.REQUEST_INSTALL_PACKAGES})

protectedvoidcheckUpdate(){

showLoadingDialog("检测更新中...");

version = AppUpdateUtil.getAppVersionCode(this);//检查当前版本号

// 调用方法,,,接口的具体实现,接收传过来的参数,再调自己的方法,

requestAppUpdate(version, newDataRequestListener() {

@Override

publicvoidsuccess(UpdateAppBean data){

// 返回的json,getStatus为0时,去下载apk文件,这里是下载apk文件的方法

updateApp(data.getData().getApk_url());

}

@Override

publicvoidfail(String msg){

// 返回的json,getStatus为1时,提示:"已是最新版本!"

SToast(msg);

dismissLoadingDialog();

}

});

}

//检查版本号,第一次请求(post),,,UpdateAppBean根据服务器返回生成

privatevoidrequestAppUpdate(intversion, finalDataRequestListener listener){

OkGo.post(Const.HOST_URL + Const.UPDATEAPP).params("version", version).execute(newStringCallback() {

@Override

publicvoidonSuccess(Response response){

Gson gson = newGson();

UpdateAppBean updateAppBean = gson.fromJson(response.body(), UpdateAppBean.class);

if(updateAppBean.getStatus() == 0) {

listener.success(updateAppBean);

} else{

listener.fail(updateAppBean.getMsg());

}

}

@Override

publicvoid(Response response){

listener.fail("服务器连接失败");

dismissLoadingDialog();

}

});

}

//如果有新版本,提示有新的版本,然后下载apk文件

privatevoidupdateApp(String apk_url){

dismissLoadingDialog();

DialogUtils.getInstance().showDialog(this, "发现新的版本,是否下载更新?",

newDialogUtils.DialogListener() {

@Override

publicvoidpositiveButton(){

downloadApp(apk_url);

}

});

}

//下载apk文件并跳转(第二次请求,get)

privatevoiddownloadApp(String apk_url){

OkGo.get(apk_url).tag(this).execute(newFileCallback() {

@Override

publicvoidonSuccess(Response response){

String filePath = response.body().getAbsolutePath();

Intent intent = IntentUtil.getInstallAppIntent(mContext, filePath);

// 测试过这里必须用startactivity,不能用stratactivityforresult

mContext.startActivity(intent);

dismissLoadingDialog();

mDownloadDialog.dismiss();

mDownloadDialog=null;

}

@Override

publicvoiddownloadProgress(Progress progress){

// showDownloadDialog();

// mProgress.setProgress((int) (progress.fraction * 100));

if(mDownloadDialog == null) {

// 构造软件下载对话框

AlertDialog.Builder builder = newAlertDialog.Builder(mContext);

builder.setTitle("正在更新");

// 给下载对话框增加进度条

finalLayoutInflater inflater = LayoutInflater.from(mContext);

View v = inflater.inflate(R.layout.item_progress, null);

mProgress = (ProgressBar) v.findViewById(R.id.update_progress);

builder.setView(v);

mDownloadDialog = builder.create();

mDownloadDialog.setCancelable(false);

mDownloadDialog.show();

}

mProgress.setProgress((int) (progress.fraction * 100));

}

});

}

2.2 DataRequestListener:

publicinterfaceDataRequestListener{

//请求成功

voidsuccess(T data);

//请求失败

voidfail(String msg);

}

接下来是工具类,来自github,参考,https://github.com/vondear/RxTool

2.3 AppUpdateUtil:

/**

* 获取App版本码

*

* @paramcontext 上下文

* @returnApp版本码

*/

publicstaticintgetAppVersionCode(Context context){

returngetAppVersionCode(context, context.getPackageName());

}

2.4 IntentUtil:

publicclassIntentUtil{

/**

* 获取安装App(支持7.0)的意图

*

* @paramcontext

* @paramfilePath

* @return

*/

publicstaticIntent getInstallAppIntent(Context context, String filePath){

//apk文件的本地路径

File apkfile = newFile(filePath);

if(!apkfile.exists()) {

returnnull;

}

Intent intent = newIntent(Intent.ACTION_VIEW);

Uri contentUri = FileUtil.getUriForFile(context, apkfile);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

}

intent.setDataAndType(contentUri, "application/vnd.android.package-archive");

returnintent;

}

2.5 FileUtil:

/**

* 将文件转换成uri(支持7.0)

*

* @parammContext

* @paramfile

* @return

*/

publicstaticUri getUriForFile(Context mContext, File file){

Uri fileUri = null;

if(Build.VERSION.SDK_INT >= 24) {

fileUri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", file);

} else{

fileUri = Uri.fromFile(file);

}

returnfileUri;

}

3.遇到的问题

9.0手机authorities配置出错,导致无法安装,

解决办法:

1.项目中使用了Androidx,AndroidManifest.xml的配置中就必须使用androidx的fileprovider

2.这里的authorities与FileUtil.java中的要一样,我就是字母P大写了导致错误

作者:_老李

链接:https://juejin.im/post/5cc3b00a518825253a16af2a返回搜狐,查看更多

责任编辑:

android9 apk自动安装功能,Android app自动更新总结(已适配9.0)相关推荐

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

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

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

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

  3. android app 自动登录,Android APP首次登录和之后自动登录流程

    Android APP首次登录和之后自动登录流程 Android APP首次登录和之后自动登录流程 App登陆保存数据流程 App因为要实现自动登陆功能,所以必然要保存一些凭据,所以比较复杂. App ...

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

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

  5. android app实现更新功能

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

  6. idea没有代码自动提示功能和包自动引入不了问题

    idea没有代码自动提示功能和包自动引入不了问题 原因:节电模式 File -> Power Save Mode (被勾选了) 处理方法: File -> Power Save Mode ...

  7. android下载完成不能自动安装失败,android 8.0以上自动安装apk失败的解决问题

    随着android 系统的不断更新和发展,针对应用的权限管理也是越来越严格.这可是坑坏了我们这些搬砖的程序员,因为在一些上架平台,都一一宣布,以后的android应用 targetSdkVersion ...

  8. android app 自动更新,AndroidUpdateDemo

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

  9. android APP自动增量更新

    APP自动增量更新 抽取的Android自动更新库,目的是几行代码引入更新功能,含服务端代码,欢迎Star,欢迎Fork,谢谢- 博客同步自:个人博客主页 代码github: https://gith ...

  10. android 市场自动安装软件,Android 应用中跳转到应用市场评分示例

    在开发Android App过程中,经常会遇见这样的功能.从当前的app跳转到一个应用商店并且跳转到自己app的详情页面,让用户给自己的App进行评分.评价,从而提高自己App的排名.下面介绍三种方法 ...

最新文章

  1. Spring Cloud微服务实战:手把手带你整合eurekazuulfeignhystrix
  2. (译)理解 LSTM 网络 (Understanding LSTM Networks by colah)
  3. go WaitGroup的坑
  4. LeetCode 554. 砖墙(map计数)
  5. java 获取当前月份减1_java String 日期 转成 Date, 月份减1
  6. 简易博客编辑器:玩转document.execCommand命令
  7. 1470. 重新排列数组
  8. Linux学习笔记(6)
  9. 【BFS】大胖子走迷宫
  10. 人工智能轨道交通行业周刊-第44期(2023.5.8-5.14)
  11. onedrive教育版登录不上
  12. Java基础学习——操作系统批处理(操作系统命令)
  13. java实现文件重命名
  14. 深度解析Linux通过日志反查***
  15. gateway+vue实现防接口重放、防篡改
  16. [面试题][Java]当当、映客直播
  17. 妙赞大讲糖:降糖为何要动“刀”
  18. Python爬取微信好友的信息
  19. 计算机专业复试简历超实用
  20. 25张图详解 | 大型分布式电商系统架构(二)

热门文章

  1. PIXI入门-PIXI文档翻译(1)
  2. Filter过滤器及其作用
  3. 算法设计与分析课设-探寻宝藏-双线程DP问题-C语言
  4. JAVA程序员必备网站
  5. ftp上传工具 6款用了就会爱上的ftp上传工具良心推荐
  6. 新旧音标对照表与英式音标表
  7. python实现服务器客户端模式_Python简单实现服务器与客户端通讯
  8. vmware共享文件夹不显示
  9. Tomcat日志切割工具 logrotate
  10. 感悟哪吒的故事,我命由我不由天