Android APK下载安装(自动更新)
目录
1.配置:
1.1 AndroidManifest.xml中添加权限和FileProvider
1.2 新建文件(路径:res\xml\file_paths.xml)
1.3 (app的)build.gradle
2.这里以点击按钮进行更新为例
2.1 核心代码
2.2 DataRequestListener
2.3 AppUpdateUtil
2.4 IntentUtil
2.5 FileUtil
3.遇到的问题
9.0手机authorities配置出错,导致无法安装, 解决办法
1.配置:
1.1 AndroidManifest.xml中添加权限和FileProvider
<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.fengzhi.wuyemanagement.fileprovider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>
1.2 新建文件(路径:res\xml\file_paths.xml)
<paths><external-path path="." name="external_storage_root" />
</paths>
1.3 (app的)build.gradle
//okgo 网络请求implementation "com.lzy.net:okgo:3.0.4"//gsonimplementation 'com.google.code.gson:gson:2.8.2'//权限implementation "org.permissionsdispatcher:permissionsdispatcher:4.3.1"//权限annotationProcessor "org.permissionsdispatcher:permissionsdispatcher-processor:4.3.1"
2.这里以点击按钮进行更新为例
2.1 核心代码
private int version;/* 更新进度条 */private ProgressBar mProgress;private AlertDialog mDownloadDialog;--------------------------------------------------------------------------------------------------------------------//点击按钮,检查权限,,,检查更新的方法@NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.REQUEST_INSTALL_PACKAGES})protected void checkUpdate() {showLoadingDialog("检测更新中...");version = AppUpdateUtil.getAppVersionCode(this);//检查当前版本号
// 调用方法,,,接口的具体实现,接收传过来的参数,再调自己的方法,requestAppUpdate(version, new DataRequestListener<UpdateAppBean>() {@Overridepublic void success(UpdateAppBean data) {
// 返回的json,getStatus为0时,去下载apk文件,这里是下载apk文件的方法updateApp(data.getData().getApk_url());}@Overridepublic void fail(String msg) {
// 返回的json,getStatus为1时,提示:"已是最新版本!"SToast(msg);dismissLoadingDialog();}});}//检查版本号,第一次请求(post),,,UpdateAppBean根据服务器返回生成private void requestAppUpdate(int version, final DataRequestListener<UpdateAppBean> listener) {OkGo.<String>post(Const.HOST_URL + Const.UPDATEAPP).params("version", version).execute(new StringCallback() {@Overridepublic void onSuccess(Response<String> response) {Gson gson = new Gson();UpdateAppBean updateAppBean = gson.fromJson(response.body(), UpdateAppBean.class);if (updateAppBean.getStatus() == 0) {listener.success(updateAppBean);} else {listener.fail(updateAppBean.getMsg());}}@Overridepublic void onError(Response<String> response) {listener.fail("服务器连接失败");dismissLoadingDialog();}});}//如果有新版本,提示有新的版本,然后下载apk文件private void updateApp(String apk_url) {dismissLoadingDialog();DialogUtils.getInstance().showDialog(this, "发现新的版本,是否下载更新?",new DialogUtils.DialogListener() {@Overridepublic void positiveButton() {downloadApp(apk_url);}});}//下载apk文件并跳转(第二次请求,get)private void downloadApp(String apk_url) {OkGo.<File>get(apk_url).tag(this).execute(new FileCallback() {@Overridepublic void onSuccess(Response<File> response) {String filePath = response.body().getAbsolutePath();Intent intent = IntentUtil.getInstallAppIntent(mContext, filePath);
// 测试过这里必须用startactivity,不能用stratactivityforresultmContext.startActivity(intent);dismissLoadingDialog();mDownloadDialog.dismiss();mDownloadDialog=null;}@Overridepublic void downloadProgress(Progress progress) {
// showDownloadDialog();
// mProgress.setProgress((int) (progress.fraction * 100));if (mDownloadDialog == null) {// 构造软件下载对话框AlertDialog.Builder builder = new AlertDialog.Builder(mContext);builder.setTitle("正在更新");// 给下载对话框增加进度条final LayoutInflater 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
public interface DataRequestListener<T> {//请求成功void success(T data);//请求失败void fail(String msg);
}
2.3 AppUpdateUtil
/*** 获取App版本码** @param context 上下文* @return App版本码*/public static int getAppVersionCode(Context context) {return getAppVersionCode(context, context.getPackageName());}
2.4 IntentUtil
public class IntentUtil {/*** 获取安装App(支持7.0)的意图** @param context* @param filePath* @return*/public static Intent getInstallAppIntent(Context context, String filePath) {//apk文件的本地路径File apkfile = new File(filePath);if (!apkfile.exists()) {return null;}Intent intent = new Intent(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");return intent;}
2.5 FileUtil
/*** 将文件转换成uri(支持7.0)** @param mContext* @param file* @return*/public static Uri 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);}return fileUri;}
3.遇到的问题
9.0手机authorities配置出错,导致无法安装, 解决办法
项目中使用了Androidx,AndroidManifest.xml的配置中就必须使用androidx的fileprovider
这里的authorities与FileUtil.java中的要一样,我就是字母P大写了导致错误
Android APK下载安装(自动更新)相关推荐
- android 系统(143)---Android实现App版本自动更新
Android实现App版本自动更新 现在很多的App中都会有一个检查版本的功能.例如斗鱼TV App的设置界面下: 当我们点击检查更新的时候,就会向服务器发起版本检测的请求.一般的处理方式是:服务器 ...
- android应用程序的自动更新升级(自身升级,通过tomcat),[SaltStack] Minion-conf自动更新...
minion-conf配置文件自动更新, 加载 minion-conf是每个minion自身以来的配置, 为了方便我们在中心管控机上(Master)统一配置, 然后下发文件, 进而使得Minion能够 ...
- Kali Linux攻防系统(一:攻防系统Kali Linux下载安装与更新)
任务一:攻防系统Kali Linux下载安装与更新 1.1.安装Kali Linux虚拟机 1.1.1.电脑硬件配置至少达到 CPU 内存 存储 >四核 >4G >20G 1.1.2 ...
- Windows Android SDK下载安装,配置,异常问题解决教程
Windows Android SDK下载安装,配置,异常问题解决教程 参考文章: (1)Windows Android SDK下载安装,配置,异常问题解决教程 (2)https://www.cnbl ...
- android 闪退解决方案,Android apk无法安装及闪退问题解决办法
Android apk无法安装及闪退问题 app在部分手机上(低版本)打不开或打开就闪退的问题 之前做项目集成的是 环信的sdk ,环信的sdk 确实很好,客服 也很给力.但是在集成的过程中发现,ap ...
- IIS 添加mime 支持 apk,exe,.woff,IIS MIME设置 ,Android apk下载的MIME 设置 苹果ISO .ipa下载mime 设置...
IIS 添加mime 支持 apk,exe,.woff,IIS MIME设置 ,Android apk下载的MIME 设置 苹果ISO .ipa下载mime 设置 原文:IIS 添加mime 支持 a ...
- jenkins依赖的android sdk下载安装
jenkins下android sdk下载安装 一:Android SDK 二:SDK Tools 三:Android SDK Licences 一:Android SDK 下载地址:http://t ...
- android apk下载完成后调用安装
一般应用里下载完apk的话都会自动调取安装apk的方法,在下载完成后直接调用下面这个方法即可调用apk安装功能 public static void install(Activity activity ...
- android自动点击adb,自动点击器adb手机安卓软件下载安装-自动点击器adb免root最新版下载v1.0.5-乐游网软件下载...
<自动点击器adb>是一款非常实用的自动手机点击软件,软件可以在不生成脚本,不需要root的情况下模拟真实的点击,帮助用户解决手机中需要不断点击的情况,软件的操作简单容易上手,当然功能比需 ...
- Android如何实现APP自动更新
先来看看要实现的效果图: 对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,360,机锋,应用宝等等,当我们想上线一款新版本APP时,先不说渠道打包的麻烦,单纯指上传APP ...
最新文章
- idea python-IntelliJ IDEA安装运行python插件方法
- 2018年安卓绿色联盟数据报告
- Mybatis解决字段名与实体类属性名不相同的冲突
- 微信8年,你从中学到了什么?
- JUC系列(六) | Callable和Future接口详解使用、FutureTask应用 获取异步线程返回值
- win10连接烟台大学校园网
- Intel 64/x86_64/IA-32/x86处理器 - 锁原子操作(1) - 处理器保证的原子操作
- javaweb基础 - Servlet
- 一步步学习SPD2010--第二章节--处理SP网站(9)---- 关键点
- Core、处理器(CPU)核、处理器(CPU)、处理器(CPU)架构、微结构、指令集、指令集架构、ARMv7 内核架构
- Mac快速录制音频工具:Recordia
- spring boot 启动报错:Reason: Canonical names should be kebab-case ('-' separated), lowercase
- Atlassian与DevOps 系列产品选择方案介绍
- 怎么屏蔽还有照片_【文末福利】在朋友圈发男神照片忘了屏蔽父母,麻麻的回应亮了…...
- Android画图方式
- python 类属性函数,python_30期【类包含属性和函数】
- excel换行快捷键_实用 excel 最实用快捷键大全
- mysql格式化日期和时间
- osgEarth目标选择
- C语言自学路之计算平方(输入验证)