android apk版本适配,android 下载apk并安装,可用于更新版本用途(适配7.0或7.0以上系统)...
哥们点个赞再走呀
制作不容易,条件允许情况下,打赏一下,谢谢
作者使用xUtils下载文件,如使用其他框架下载,可在下载逻辑进行修改
AndroidManifest
android:usesCleartextTraffic="true"
...>
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
file_paths.xml
下载逻辑和安装
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
permission();
}
//点击下载按钮
public void onDownload(View view) {
if (permission() == false) {
Toast.makeText(this, "未获取权限", Toast.LENGTH_SHORT).show();
return;
}
downLoad();
}
//下载文件
private void downLoad() {
//apk下载链接
String apkUrl = "http://xxx.apk";
//文件路径
String filePath = getExternalCacheDir() + "/Download/file.apk";
//下载
RequestParams params = new RequestParams(apkUrl);
params.setSaveFilePath(filePath);//保存路径
x.http().post(params, new Callback.ProgressCallback() {
@Override
public void onSuccess(File result) {
installAPK(MainActivity.this, result);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
@Override
public void onWaiting() {
}
@Override
public void onStarted() {
}
@Override
public void onLoading(long total, long current, boolean isDownloading) {
Log.i("MainActivity", "正在下载:" + (int)((float)current/total * 100));
}
});
}
//安装apk
public void installAPK(Context context, File apkFile) {
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {// 判断版本大于等于7.0
uri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", apkFile);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK);
} else {
uri = Uri.parse("file://" + apkFile);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
context.startActivity(intent);
}
//获取权限
private boolean permission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int REQUEST_CODE_CONTACT = 101;//授权回调标识
//需要的权限
String[] permissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE //下载的apk保存到手机的权限
};
if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED) { //未授权
requestPermissions(permissions, REQUEST_CODE_CONTACT); //申请权限
return false;
} else {
return true;
}
}
return true;
}
}
制作不容易,条件允许情况下,打赏一下,谢谢
android apk版本适配,android 下载apk并安装,可用于更新版本用途(适配7.0或7.0以上系统)...相关推荐
- android应用市场点击下载APK安装详解
Android系统启动篇 1,<android系统启动流程简介> 2,<android init进程启动流程> 3,<android zygote进程启动流程> 4 ...
- 怎样从一个手机上安两个不同版本的软件_一部手机上怎么安装两个不同版本的微信?一部手机安装两个不同版本微信的方法...
一部手机上怎么安装两个不同版本的微信?一部手机安装两个不同版本微信的方法.很多朋友都不是很清楚,其实方法很简单的,下面小编就为大家介绍一下,一起来看看吧. 1.安卓微信双卡方法:准备工作 从上图我们可 ...
- android服务下载apk,Android 一个简单的版本更新下载apk小示例
一.简介: 1.运用 okhttp + notification 通知栏带进度的下载apk,下载完毕后并自动安装,如果用户取消可在通知栏点击安装,点击一次通知栏移除,同时支持自动静默下载(后台默默下载 ...
- 使用Android自带的DownloadManager下载ApK并安装
一.在 AndroidManifest.xml 中的准备 进行网络请求,需要申请<uses-permission android:name="android.permission.IN ...
- Android 天气APP(二十六)增加自动更新(检查版本、通知栏下载、自动安装)
上一篇:Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据 效果图 开发流程 1.开发前言 2.上传应用到分发平台 3.版本数据请求与存储 4.检查版本更新.自定义更新提示弹窗 ...
- android apk自动安装包下载,apk安装包管理app下载-apk安装包文件管理 安卓版v13-PC6安卓网...
apk安装包文件管理app是一款实用系统应用,apk安装包文件管理app是个小巧好用的手机内安装包管理工具.apk安装包文件管理app让你可快捷的管理手机里有意或无意下载的各种安装包. 软件介绍 ap ...
- matlab下载保姆级安装教程,哪个版本比较好些?
Matlab最新版是款功能实用性强的商业数学工具.Matlab官方版可以用于分析数据.开发算法.创建模型,数据图表生成.APP打包.APP开发.并且Matlab还广泛应用于:数据分析.无线通信.深度学 ...
- 下载了最新版本flash player,还是不能安装,还是提示版本低(转)
当我们使用Internet Explorer 9(IE9)浏览器访问含有大量Flash元素的网页时,可能会发现iexplorer.exe进程占用了大量的CPU资源,多开几个这样的页面就会严重影响到系统 ...
- 多个linux发行版本混合安装盘,使用 MultiBootUSB 安装多个 Linux 版本
导读 我喜欢通过 U 盘尝试不同的 Linux 发行版.它让我可以在真实的硬件上测试操作系统,而不是虚拟化的环境中.此外,我可以将 USB 插入任何系统(比如 Windows 系统),做任何我想要的事 ...
最新文章
- DDoS攻击走向应用层
- Android优化——UI优化(二) 使用include标签复用布局
- 《Adobe SiteCatalyst网站分析权威手册》一1.3 SiteCatalyst是怎么工作的
- Ubuntu安装qwt步骤
- 让美团、京东、搜狐都说好的数据仓库,牛在哪?
- Netbeans Platform的Lookup -- 边学边记
- mysql8 docker镜像源_Docker 搭建 MySQL 8版本
- 对百度输入法小米版的用户体验
- 通达信插件模板 Purebasic版
- python 文件内容对比_用python进行文件比对
- 触动精灵 获取外网IP
- Python编程:从入门到实践.pdf :Python 基础笔记,最基本的 Python语法,快速上手入门 Python
- 如何在命令行状态清除SEP隔离区(Quarantine)
- 什么是一套完全私有的即时通讯系统
- 如何设计一个权限管理模块?
- 猫眼电影爬取(woff 字体文件解析)
- 机器学习模型什么时候需要做数据标准化?
- 计算机网络1255,国家开放大学电大本科《计算机网络》2024期末试题及答案(试卷号:1255).docx...
- 我的世界手机版javaui材质包_教你然后用手机玩电脑版我的世界模组?
- sqlserver 通过配置文件实现mybatis逆向工程
热门文章
- 苹果4s忘记id密码怎么办_忘记手机密码怎么办 忘记手机密码解决办法【详解】...
- kafka 分组消费topic_Kafka消费组(consumer group)(转)
- 导出简单Excel模板(通用)
- 预装正版,反对盗版的一条途径
- 第9类商标的计算机和计算机软件类似吗,手机APP属于什么商标类别 第9类精品商标分享...
- Jupyter Notebook 最全快捷键(逐渐补充)
- 1342. 将数字变成 0 的操作次数 / 1507. 转变日期格式
- Spring Cloud Alibaba 分布式微服务高并发数据平台化(中台)思想+多租户saas企业开发架构技术选型和设计方案
- java 关注公众号_推荐10个值得关注的技术公众号
- golang常用库之-操作redis go-redis/redis库、 go-redsync/redsync库(redis分布式锁)