android9 apk自动安装功能,Android app自动更新总结(已适配9.0)
原标题: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)相关推荐
- Android APP 自动更新实现(适用Android9.0)
Android App自动更新基本上是每个App都需具备的功能,参考网上各种资料,自己整理了下,先来看看大致的界面: 一.实现思路: 1.发布Android App时,都会生成output-metad ...
- android通知栏应用程序更新,Android App自动更新之通知栏下载
本文实例为大家分享了Android App自动更新通知栏下载的具体代码,供大家参考,具体内容如下 版本更新说明 这里有调用UpdateService启动服务检查下载安装包等 1. 文件下载,下完后写入 ...
- android app 自动登录,Android APP首次登录和之后自动登录流程
Android APP首次登录和之后自动登录流程 Android APP首次登录和之后自动登录流程 App登陆保存数据流程 App因为要实现自动登陆功能,所以必然要保存一些凭据,所以比较复杂. App ...
- Android App自动更新解决方案(DownloadManager)
Android App自动更新解决方案(DownloadManager) 参考文章: (1)Android App自动更新解决方案(DownloadManager) (2)https://www.cn ...
- android app实现更新功能
功能演示 Android App自动更新基本上是每个App都需具备的功能.网上有各种更新方式,但基本都是往年的了,最近刚查资料写完一个app更新功能,发现了许多app更新的博客内没有详细说明的小问题, ...
- idea没有代码自动提示功能和包自动引入不了问题
idea没有代码自动提示功能和包自动引入不了问题 原因:节电模式 File -> Power Save Mode (被勾选了) 处理方法: File -> Power Save Mode ...
- android下载完成不能自动安装失败,android 8.0以上自动安装apk失败的解决问题
随着android 系统的不断更新和发展,针对应用的权限管理也是越来越严格.这可是坑坏了我们这些搬砖的程序员,因为在一些上架平台,都一一宣布,以后的android应用 targetSdkVersion ...
- android app 自动更新,AndroidUpdateDemo
Android课程-App更新策略 @(Android) 第一节 课程介绍 概述 App更新是应用当中很常见的一个功能,基本上联网的app都应该具备这样的功能,对于更新迭代比较快速的产品,应用更新升级 ...
- android APP自动增量更新
APP自动增量更新 抽取的Android自动更新库,目的是几行代码引入更新功能,含服务端代码,欢迎Star,欢迎Fork,谢谢- 博客同步自:个人博客主页 代码github: https://gith ...
- android 市场自动安装软件,Android 应用中跳转到应用市场评分示例
在开发Android App过程中,经常会遇见这样的功能.从当前的app跳转到一个应用商店并且跳转到自己app的详情页面,让用户给自己的App进行评分.评价,从而提高自己App的排名.下面介绍三种方法 ...
最新文章
- Spring Cloud微服务实战:手把手带你整合eurekazuulfeignhystrix
- (译)理解 LSTM 网络 (Understanding LSTM Networks by colah)
- go WaitGroup的坑
- LeetCode 554. 砖墙(map计数)
- java 获取当前月份减1_java String 日期 转成 Date, 月份减1
- 简易博客编辑器:玩转document.execCommand命令
- 1470. 重新排列数组
- Linux学习笔记(6)
- 【BFS】大胖子走迷宫
- 人工智能轨道交通行业周刊-第44期(2023.5.8-5.14)
- onedrive教育版登录不上
- Java基础学习——操作系统批处理(操作系统命令)
- java实现文件重命名
- 深度解析Linux通过日志反查***
- gateway+vue实现防接口重放、防篡改
- [面试题][Java]当当、映客直播
- 妙赞大讲糖:降糖为何要动“刀”
- Python爬取微信好友的信息
- 计算机专业复试简历超实用
- 25张图详解 | 大型分布式电商系统架构(二)