Android开发之下载Apk安装的方法兼容Android7.0和8.0及以上
具体查看代码:
首先在清单文件配置三个权限读写权限和请求安装权限(兼容Android8.0手机)如下:
<!--安装apk权限--><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /><!-- 在SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><!-- 往SDCard 读写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
兼容Android7.0 FileProvider
<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.provider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths" /></provider>
记得在res下面配置xml文件夹:如下:
下面是provider_paths.xml的文件内容
<?xml version="1.0" encoding="utf-8"?>
<paths><external-pathname="external_files"path="." />
</paths>
然后上下载和安装的代码:
/*** 下载apk的方法** @param activity 上下文*/public void downloadApk(final Activity activity) {HttpUtils httpUtils = new HttpUtils();// 判断sd卡是否挂载if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {final String filePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/jfsj.apk";
// httpUtils.download("http://cdn1.down.apk.gfan.net.cn/Pfiles/2020/05/21/gfanxapp_20200521194529_45df3390-b57e-4c16-b0fb-fb0ebcac1a80.apk", "/mnt/sdcard/mobilesafe72_2.apk",httpUtils.download("https://imtt.dd.qq.com/16891/apk/53F52C519A0CDEF8A6BA6579A7BD20F2.apk?fsname=com.wifi.key_5.8.9_589.apk&csr=1bbd", filePath,new RequestCallBack<File>() {// 下载成功的时候调用@Overridepublic void onSuccess(ResponseInfo<File> arg0) {CommonLoading.getInstance().closeDialog();Toast.makeText(activity.getApplicationContext(), "下载成功", Toast.LENGTH_SHORT).show();// 安装最新版本install(filePath, activity);}// 下载失败的时候调用@Overridepublic void onFailure(HttpException arg0, String arg1) {Log.e("下载失败", "失败了:" + arg0.getLocalizedMessage());Toast.makeText(activity.getApplicationContext(), "下载失败了," + arg0.getLocalizedMessage(), Toast.LENGTH_LONG).show();}@Overridepublic void onLoading(long total, long current, boolean isUploading) {super.onLoading(total, current, isUploading);long progress = (current / total) * 100;Log.e("下载进度", current + "/" + total + ":进度" + progress + "%");}});}}/*** 安装最新版本** @param filePath 安装包的路径*/private void install(String filePath, Activity activity) {Intent intent = new Intent();intent.setAction("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");Uri fileURI;File file = new File(filePath);if (Build.VERSION.SDK_INT >= 24) {fileURI = FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".provider", file);} else {//android70.以下手机fileURI = Uri.fromFile(file);}//Android7.0以上必须添加如下代码activity.grantUriPermission(activity.getPackageName(), fileURI, Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.setDataAndType(fileURI, "application/vnd.android.package-archive");// 当当前的activity退出的时候,会调用之前activity的onActivityResult方法activity.startActivityForResult(intent, 0);}
使用方法:调用downloadApk这个方法即可。
注意记得添加动态权限否则报错,还有就是如果使用android9.0以上手机并且你的网址是http的非https,记得在清单文件添加如下:否则可能会无法下载apk
android:usesCleartextTraffic="true"
Android开发之下载Apk安装的方法兼容Android7.0和8.0及以上相关推荐
- android应用市场点击下载APK安装详解
Android系统启动篇 1,<android系统启动流程简介> 2,<android init进程启动流程> 3,<android zygote进程启动流程> 4 ...
- Android 下载APK 安装APK 打开APK
今天有了一个这样的需求 :下载一个apk文件,然后当你下载完成后,按钮的文字发生改变,变成点击安装,然后安装完成之后,变成打开. 这是下载apk的方法: ? 1 2 3 4 5 6 7 8 9 10 ...
- Android:Android SDK的下载与安装
Android SDK的下载与安装 一.Android SDK简介 Android SDK(Software Development Kit,软件开发工具包)被软件开发工程师用于为特定的软件包.软件框 ...
- Android开发之打包APK详解
Android开发之打包APK详解 一.APK简介 二.无需密匙的 apk 三.有密匙的 apk(常规) 生成 apk 其实有两个方法: 方法一:生成无密匙的 apk 文件: 方法二:生成有密匙的 a ...
- 文件管理器android实现,Android开发之简单文件管理器实现方法
易采站长站为您分析Android开发之简单文件管理器实现方法,简单实现了Android的文件目录查看,文件重命名,打开,删除等功能,需要的朋友可以参考下 本文实例讲述了Android开发之简单文件管理 ...
- Android开发——RecyclerView特性以及基本使用方法(二)
0. 前言 随着Android的发展,虽然ListView依旧重要,但RecyclerView确实越来越多的被大家使用.但显然并不能说RecyclerView就一定优于ListView,而是应该根据 ...
- android.cat 镜像,Android开发利器之pidcat安装方式
介绍pidcat: pidcat 是Android届JakeWharton大神开发的一款命令行工具,堪称Android开发利器,它能方便Android程序猿捕获日志,过滤日志,定位程序问题,超级好用. ...
- go语言01SDK、GoLand开发工具下载和安装
Go语言学习01:SDK.GoLand开发工具下载和安装,及测试第一个程序:输出hello world 半夜凌晨写的笔记,如果对你有帮助,加个关注或点赞哈感谢,吼吼~ Go语言的学习,开始安装软件就遇 ...
- Android开发环境搭建及常见问题解决方法
Android开发环境搭建及常见问题解决方法 参考文章: (1)Android开发环境搭建及常见问题解决方法 (2)https://www.cnblogs.com/rwxwsblog/p/476978 ...
最新文章
- docker 镜像修改的配置文件自动还原_原创 | 全网最实在的docker入门教程四
- StaticLayout的介绍/使用
- 带有Spring的JavaFX 2
- 不用背景图片,只用css代码实现面包屑样式
- scala----计数器zipWithIndex
- 虚拟服务器怎么搭建php,怎样搭建Apache+MySQL+PHP服务器
- 最新android studio 第三方库包导入方法jar,so,module
- 数组中元素与字节的关系
- 【matlab】clc,close,close all,clear,clear all作用
- 谈胶印机供水装置调节的技巧
- 翻车率贼高的一个小题目
- 《Python数据分析基础教程:NumPy学习指南(第2版)》笔记5:第三章 常用函数1——文件读写、算术平均值、最大值最小值、极值
- 120篇精华文章打包送,干货慎入!
- 3DMAX基础学习总结(1)
- java script总结1
- DFC Search In Depth-转
- 钢铁企业如何分步实施信息化
- LateX 全文(局部)字体大小设置
- 查询成绩表中同时考了科目1和科目2,并且科1大于科2的学生
- 海滩上有一堆桃子,五只猴子来分
热门文章
- 《c语言从入门到精通》看书笔记——第7章 循环控制
- android 内部拦截,如何使用proxy,如何在内部拦截get方法
- html 给 ol添加abc,英语abc怎么写
- php一句话过狗,整理的最新WebSHell (php過狗一句話,過狗菜刀,2016過狗一句話,2016php免殺一句話)...
- add git 指定类型文件夹_UE4 使用git配合远程仓库
- 吸尘车-真空吸尘车:真空吸尘车
- 阅读王概凯老师架构漫谈系列总结
- sqlserver改主键初始ID
- appium 5-27屏幕旋转、
- 分布式系列四: HTTP及HTTPS协议