从Fragment中安装APK首次触发出现崩溃问题该如何解决?
问题根因
- 安卓8.0(API level 26)及以上系统要求应用必须持有
REQUEST_INSTALL_PACKAGES权限才能触发APK安装流程,你当前代码没有提前申请该权限,首次调用时缺少权限直接触发安装就会崩溃,后续用户手动授予权限后流程自然正常 - 你当前的Intent Flag设置存在冗余,
FLAG_ACTIVITY_CLEAR_TASK搭配FLAG_ACTIVITY_NEW_TASK会清空当前应用的任务栈,部分系统版本上会导致跳转后当前页面被销毁引发异常
修复步骤
- 先在
AndroidManifest.xml中添加安装APK所需的权限声明 - 调整安装触发逻辑,先校验权限、权限申请通过后再执行安装流程
- 修正Intent的Flag配置,移除不必要的
FLAG_ACTIVITY_CLEAR_TASK
修正后的代码示例
Manifest配置
<!-- 安装APK所需权限 仅安卓8.0+生效 --> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
Fragment安装触发逻辑
// 点击安装按钮时先校验权限 fun onInstallClick(apkUri: Uri) { when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { if (requireContext().packageManager.canRequestPackageInstalls()) { // 已有权限,直接调用安装逻辑 viewModel.installApp(apkUri) } else { // 申请安装未知来源应用权限 val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:${requireContext().packageName}")) registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { // 权限申请通过,执行安装 viewModel.installApp(apkUri) } }.launch(intent) } } else -> { // 低版本系统不需要额外权限,直接安装 viewModel.installApp(apkUri) } } }
ViewModel安装逻辑修正
fun installApp(uri: Uri) { viewModelScope.launch(context = exceptionHandler + DEFAULT) { val promptInstall = Intent(Intent.ACTION_VIEW, uri) promptInstall.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) promptInstall.setDataAndType(uri, "application/vnd.android.package-archive") // 移除FLAG_ACTIVITY_CLEAR_TASK,避免清空当前应用任务栈 promptInstall.flags = Intent.FLAG_ACTIVITY_NEW_TASK promptInstall.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) startActivityMutableLiveData.postValue(promptInstall.toOneTimeEvent()) } }
扩展函数安全优化
fun Intent.startActivityFromIntent(context: Context) { // 增加类型判断,避免Context非Activity场景的强转崩溃 if (context is Activity) { context.startActivity(this) } }
额外注意事项
- 如果你适配了Android 10及以上系统,要确保传入的APK Uri是通过FileProvider生成的
content://类型Uri,不要直接使用file://类型Uri,否则会触发读写权限异常 - 如果安装的是自身应用升级包,配置FileProvider时注意不要限制对应目录的访问权限
内容的提问来源于stack exchange,提问作者Faz
相关产品推荐
相关产品推荐

