Android 8.0 未知来源安装适配

212 阅读1分钟

Activity中实现

  1. 判断安卓SDK版本
// 如果SDK 版本>=Android O版本,则进行未知源安装,否则直接进行安装即可
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O

  1. 判断是否有未知源安装权限
// 此方法返回是否有未知源安装权限,true进行apk安装,false进行未知源安装权限申请
val boolean=packageManager.canRequestPackageInstalls()
  1. 申请未知源安装权限
// 注意这个是8.0新API 第一个参数指定action,第二个参数指定当前应用的包名(可以跳转到当前应用的未知源安装设置界面)
// 如果在onActivityResult中判断成功了,进行安装,否则,提示没有未知源安装权限,无法安装,进行提示操作
val intent = Intent(
    Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,
    Uri.parse("package:${activity.packageName}")
);
activity.startActivityForResult(intent, 1)


  1. 执行安装方法
// apkUrl 是磁盘中apk文件的路径
private fun installApk(apkUrl: String) {
    val intent = Intent(Intent.ACTION_VIEW)
    // 从9.0开始,不能直接从非Activity环境(如Service,BroadcastReceiver)中启动Activity,需要加这个flag
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    // 表示对目标应用临时授权该Uri所代表的文件
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    val file = File(apkUrl)
    val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
        FileProvider.getUriForFile(
            activity,
            activity.packageName + ".provider",
            file
        )
    else
        Uri.fromFile(file)

    intent.setDataAndType(uri, "application/vnd.android.package-archive")
    startActivity(intent)
}