安卓中通过代码安装.apk时如何获取安装成功/失败的回调
安卓APK安装操作的回调获取方案
你可以通过系统提供的安装结果返回能力获取安装成功/失败的状态,具体实现分为两种:
1. startActivityForResult 实现(兼容低版本系统)
将原有startActivity替换为带请求码的启动方式:
// 自定义安装请求常量 private const val REQUEST_INSTALL_APK = 1001 // 启动安装的代码修改为 val installIntent = Intent(Intent.ACTION_VIEW) installIntent.setDataAndType(localUri, "application/vnd.android.package-archive") installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // 适配部分高版本系统要求 startActivityForResult(installIntent, REQUEST_INSTALL_APK)
重写onActivityResult接收安装结果:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_INSTALL_APK) { when(resultCode) { Activity.RESULT_OK -> { // 安装成功 } Activity.RESULT_CANCELED -> { // 安装终止,包含两种情况:用户主动取消安装、APK解析错误等安装失败场景 // 可提前校验下载APK的完整性(文件大小、MD5和服务端下发值是否匹配)区分两类原因:校验不通过则为解析错误,校验通过则为用户主动取消 } } } }
2. Activity Result API 实现(AndroidX 项目优先使用)
先注册安装结果回调:
private val installApkLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> when(result.resultCode) { Activity.RESULT_OK -> { // 安装成功 } Activity.RESULT_CANCELED -> { // 安装终止/失败 } } }
启动安装时调用launch方法:
val installIntent = Intent(Intent.ACTION_VIEW) installIntent.setDataAndType(localUri, "application/vnd.android.package-archive") installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION) installApkLauncher.launch(installIntent)
偶现解析包错误优化建议
绝大多数解析包错误是下载过程中APK文件损坏导致,可在启动安装前增加两层校验:
- 校验下载完成的APK文件大小和服务端返回的Content-Length是否一致
- 校验APK的MD5/SHA1值和服务端下发的校验值是否匹配,不匹配则自动触发重新下载,可解决90%以上的偶现解析错误问题
内容的提问来源于stack exchange,提问作者AlexAndro
相关产品推荐
相关产品推荐

