Android下载安装Apk

article/2025/11/8 4:53:21

1.自定义监听类,用来返回下载结果

interface DownLoadListener {/*** 下载成功之后的文件*/fun onDownloadSuccess(file: File)/*** 下载进度*/fun onDownloading(progress: Int)/*** 下载异常信息*/fun onDownloadFailed(e:Exception)
}
  1. 进行文件下载
/*** @param destFileDir 文件下载目录* @param response okHttp的返回值* @param downLoadListener 监听事件,用于返回当前下载进度等*/private fun downLoad(destFileDir: String,response: Response,downLoadListener: DownLoadListener) {val byte = ByteArray(2048)var len: Intval fileOutputStream: FileOutputStreamval file = File(destFileDir)if (!file.exists()) {file.mkdirs()}val apkFile = File(file, GeneralUtil.apkName)val input = response.body?.byteStream()val apkSize: Long = response.body?.contentLength() ?: 0Lprintln("获取到的apk大小:$apkSize")fileOutputStream = FileOutputStream(apkFile)var sum = 0.0if (apkSize != 0L) {while ((input?.read(byte).also { len = it!! }) != -1) {fileOutputStream.write(byte, 0, len)sum += len//返回当前的下载进度downLoadListener.onDownloading((sum / apkSize * 100).toInt())}}//刷新fileOutputStream.flush()//返回结果:当前已经下载成功downLoadListener.onDownloadSuccess(file)//关闭流input?.close()fileOutputStream.close()}

3.在Activity中监听下载成功或者失败的返回结果

override fun onDownloadSuccess(file: File) {//下载新版本apk完成manager.cancel(1)//跳转到新的activity,这个activity用来做安装apk的操作OpenApkFile.startOpenApkFile(this)}//上一次更新通知栏的时间private var lastTime: Long = 0Loverride fun onDownloading(progress: Int) {//动态更新进度if (lastTime == 0L) {lastTime = System.currentTimeMillis()}//与上一次更新通知栏相隔大于1s再进行更新,否则压力过大if (System.currentTimeMillis() - lastTime > 1000) { lastTime = System.currentTimeMillis()//notificationView为自定义的通知栏的布局notificationView.setProgressBar(R.id.progress, 100, progress, false)notificationView.setTextViewText(R.id.content, "$progress%")//manager为NotificationManagermanager.notify(1, notification)}}override fun onDownloadFailed(e: Exception) {//下载失败,需要删除下载失败后的文件val file = File(GeneralUtil.getDownLoadApkPathWithApkName(this))file.deleteOnExit()sendMessage(handler, HANDLERTYPE.FAIL.type, "新版本下载失败")manager.cancel(1)}

4.下载完成之后跳转到安装apk的界面

class OpenApkFile : AppCompatActivity() {private var apkFileIntent: Intent? = nullcompanion object {fun startOpenApkFile(context: Context) {context.startActivity(Intent(context, OpenApkFile::class.java))}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)apkFileIntent = getApkFileIntent(GeneralUtil.getDownLoadApkPathWithApkName(this), this)if (apkFileIntent != null) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//版本高于26需要申请权限来安装apkif (!this.packageManager.canRequestPackageInstalls()) {AlertDialog.Builder(this).setTitle("提示").setMessage("暂未开启权限,需要您开启权限安装最新版本,以获取更好的体验!").setNeutralButton("确定") { dialogInterface, _ ->run {val parse = Uri.parse("package:$packageName")val intent =Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, parse)startActivityForResult(intent, 1)dialogInterface.dismiss()}}.setNegativeButton("取消") { dialogInterface, _ ->run {Toast.makeText(this, "已拒绝安装", Toast.LENGTH_SHORT).show()dialogInterface.dismiss()finish()}}.create().show()} else {//已获得权限直接安装startActivity(apkFileIntent)finish()}} else {//版本低于26则直接安装startActivity(apkFileIntent)finish()}} else {//无法获取到uri,抛出了异常AlertDialog.Builder(this).setTitle("提示").setMessage("无法获取安装包,请联系管理员获取帮助").setNeutralButton("确定") { dialogInterface, _ ->run {dialogInterface.dismiss()finish()}}.create().show()}}private fun getApkFileIntent(param: String?, context: Context): Intent? {try {println("文件所在地址:$param")val uri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {FileProvider.getUriForFile(context,context.applicationContext.packageName.toString() + ".provider",File(param!!))} else {Uri.fromFile(File(param!!))}println("编码之后:$uri")return Intent(Intent.ACTION_VIEW).run {addCategory(Intent.CATEGORY_DEFAULT)flags = Intent.FLAG_GRANT_READ_URI_PERMISSIONaddFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
//                grantUriPermission(packageName,uri,Intent.FLAG_GRANT_READ_URI_PERMISSION)setDataAndType(uri, "application/vnd.android.package-archive")this}} catch (e: Exception) {e.printStackTrace()return null}}override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)when (requestCode) {1 -> {startActivity(apkFileIntent)finish()}else -> {}}}
}

5.FileProvider需要设置路径的xml
文件存放于res目录下的xml中:
在这里插入图片描述
file_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths><files-pathname="aaa"path="Apk/"/>
</paths>
</resources>

此段代码代表的路径为:data/data/com.包名/files/Apk/,name字段可以随便取名,不影响,path为data/data/com.包名/files下的子目录;
6.在AndroidManifest.xml注册FileProvider;

 <providerandroid:name="androidx.core.content.FileProvider"android:authorities="${applicationId}.provider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>

http://chatgpt.dhexx.cn/article/Ss1nVZDG.shtml

相关文章

在Win 11上安装APK

听说在Win11上支持直接安装apk了&#xff0c;所以先把系统升级到了Win11。 1、 安装WSA 因为安装的不是开发版&#xff0c;所以需要下载完整的WSA&#xff08;安卓子系统)&#xff0c;下载操作如下&#xff1a; 首先进入网站 https://store.rg-adguard.net&#xff0c;分别选…

google Play安装APK软件

一、参考资料 此 Google 帐号尚未与设备关联。要安装应用&#xff0c;请先访问设备上的 Play 商店应用 二、相关介绍 利用现有网站平台生成新的Google Play下载APK链接&#xff0c;APK下载器允许APK文件从Google Play直接下载到电脑或移动设备。 三、准备工作 在 Google P…

android怎么安装apk文件,apk文件怎么安装?如何安装apk文件

可能很多已经入手或者将要入手的机友,对Android系统软件如何安装和卸载比较模糊,我们有必要对之有一个系统的了解和认知,这样我们才能更容易上手,熟悉了解这个系统的使用。 一、从手机直接安装 1、将APK 文件拷贝入手机的存储卡,在手机上运行安装好的APK 程序安装器,找到…

cmd 安装 apk

➥ 检查 adb, 如果不是下面 的页面说明&#xff1b;要么配置下 环境变量&#xff1b;要么在 adb.exe 文件夹中执行 adb &#xff1b;如果你没有 去你 Android SDK 地址拿一个也行 ➥ 直接跑命令 adb install D:\MineGit\flutter_spawn\sdk\demo_2201.apk 如果你电脑 有…

androidP: apk安装流程

一、Android应用安装有如下四种方式 1 系统应用安装――开机时完成&#xff0c;没有安装界面 2.网络下载应用安装――通过market应用完成&#xff0c;没有安装界面 3.ADB工具安装――没有安装界面。 4. 第三方应用安装――通过SD卡里的APK文件安装&#xff0c;有安装界面&#…

APK安装流程及详细步骤

往期推荐 APK打包流程 APK文件结构 Android开发之数据储存 1.1 安装方式 1.安装APK文件共有4种方式&#xff1a; &#xff08;1&#xff09;系统程序安装 &#xff08;2&#xff09;通过Android市场安装 &#xff08;3&#xff09;手机自带安装 &#xff08;4&#xff09…

2021年宏观经济十大趋势展望

新冠肺炎疫情无疑是一只黑天鹅&#xff0c;对2020年世界经济带来了巨大的冲击。临近年末&#xff0c;可以从很多角度回顾2020年中国宏观经济。如果从内外循环的角度概括一下&#xff0c;我们认为今年中国经济有两个“超预期”&#xff1a;外贸超预期&#xff0c;外资超预期。 …

2010-2020年农业农村重要经济指标

数据集名称&#xff1a;农业农村重要经济指标 时间范围&#xff1a;2010-2020年 数据来源&#xff1a;农业农村部 相关说明&#xff1a; 农业农村重要经济指标&#xff0c;覆盖6大类别&#xff0c;170多张统计表 全球及主要国家大豆产量(万吨)&#xff08;2015-2019&#…

金融数据分析(十)人均国内生产总值的增长率

案例&#xff08;四&#xff09;宏观金融数据分析 项目一&#xff1a;利用世界银行公开数据平台提供的宏观经济数据比较最近40年间A国与B国的人均国内生产总值的增长率&#xff08;图表输出&#xff09; 数据可通过此网页中的下载链接获取&#xff1a;https://data.worldbank…

【指数编制系列六】景气指数编制方法

景气是经济景气的简称&#xff0c;指经济总体的运行发展态势和活跃程度&#xff0c;是用来分析经济活跃程度的经济概念。经济活动发展具有周期性扩张的特征&#xff0c;因而常用景气波动、景气循环等术语来表达经济周期波动的特点。   经济景气周期波动理论是研究产业景气周期…

持续有效的风险指标:动荡指数

量化投资与机器学习微信公众号&#xff0c;是业内垂直于量化投资、对冲基金、Fintech、人工智能、大数据等领域的主流自媒体。公众号拥有来自公募、私募、券商、期货、银行、保险、高校等行业30W关注者&#xff0c;荣获2021年度AMMA优秀品牌力、优秀洞察力大奖&#xff0c;连续…

消费与储蓄的决定-中国视角下的宏观经济

消费与储蓄的决定 – 潘登同学的宏观经济学笔记 文章目录 消费与储蓄的决定 -- 潘登同学的宏观经济学笔记 中国消费不足、储蓄过剩的事实有关中国经济需求面的关键问题 拉姆齐模型单期单个消费者的优化问题单期多个消费者的优化问题仅居民积累资本仅企业积累资本企业和居民同时…

关于指标的理解

文章目录 1.**纵向分析和横向分析**2.**电商行业**3.**广告投放**4.**基本指标**5. **经销商资金利用效果高低的指标是库销比**6. **业务分析模型**7.**可视化图表**8.**业务分析报告**9.父子级关系10.使用数据 1.纵向分析和横向分析 纵向比较同一事物在不同时期的形式&#xf…

如何理解宏观经济

从投研的视角&#xff0c;宏观经济是资产配置的基础。宏观经济研究是一种至上而下的研究方法&#xff0c;先判断整个国家的宏观经济增长的情况&#xff0c;再研究行业或者产业的变化&#xff0c;然后选择某个代表性企业进行研究&#xff0c;最后判断这个企业或者股票的资产价格…

常见经济指标学习

央行统计数据&#xff1a;http://www.pbc.gov.cn/diaochatongjisi/116219/116319/3959050/3959052/index.html 资产负债表&#xff1a;可以看出央行在扩表还是缩表 央行中的资产代表着“基础货币”&#xff0c;基础货币又称“货币基数”&#xff0c;它具有使货币供应量成倍扩…

中国经济供给面的分析-中国视角下的宏观经济

中国经济供给面的分析 – 潘登同学的宏观经济学笔记 文章目录 中国经济供给面的分析 -- 潘登同学的宏观经济学笔记 分析中国经济问题的经济学方法供需分析两个例子 数学语言 从国民财富到GDP什么是国民财富为什么要关心国民财富GDP包含价值判断三种计算GDP的方法 经济增长的供给…

宏观经济指标分析与数据可视化——PMI

PMI是一个很有意思的东西&#xff0c;一般都会认为PMI是一个领先指标。PMI中文名叫做采购经理人指数&#xff0c;听起来有点不知所云&#xff0c;说白了就是一个问卷调查。 1、PMI是怎么来的&#xff1f; 我们来假设一个场景。话说在小天才幼儿园里面&#xff0c;老师很关心小…

宏观经济分析

第三章 宏观经济分析 熟悉宏观经济分析的意义&#xff1b;熟悉总量分析和结构分析的定义、特点和关系&#xff1b;熟悉宏观分析资料的搜集与处理方法。   了解国民经济总体指标、投资指标、消费指标、金融指标以及财政指标的主要内容&#xff1b;熟悉各项指标变动对宏观经济…

第一章 宏观经济指标

1. 国内生产总值GDP 定义&#xff1a;关于产出的指标&#xff0c;指的谁一个国家或者地区在给定时间内新增的最终产品和最终服务的总价值。 &#xff08;1&#xff09;收集数据的对象&#xff1a;产品和服务 产品&#xff1a;有具体物理形态的产出。比如一支笔、一本书。服务&…

宏观经济指标

第一节、主要经济指标 一、国内生产总值 国内生产总值&#xff08;GDPGross Domestic Product&#xff09;是指一个国家或者地区所有常驻单位在一定时期内生产的所有最终产品和劳务的市场价值。GDP是国民经济核算的核心指标&#xff0c;也是衡量一个国家的总体经济状况重…