关于 Android 8.0 安装 APK 权限问题

项目中在做App应用内更新的时候,发现Android8.0以上的手机下载安装包之后,闪屏一下,无法启动安装页面进行安装。

通过查阅资料发现,大多数潜在有害应用都来源于第三方平台,Android引入 Google Play 保护机制,保护用户设备免受侵害。在 Android 8.0 中,安装未知应用权限提高了安装未知来源应用时的安全性。此权限与其他运行时权限一样,会与应用绑定,在安装时进行提示,确保用户授予使用安装来源的权限后,此权限才会提示用户安装应用。在运行 Android 8.0 或更高版本的设备上使用此权限时,恶意下载程序将无法骗取用户安装未获得预先授权的应用。

如果你想要安装某个被自己所信任的开发者的 app,则需要在每一次都手动授予“安装未知应用”权限的许可。


首先在清单文件中添加未知应用的权限:


其次就是正常的申请敏感权限:

   第一种效果图:每次都去授权安装

关于 Android 8.0 安装 APK 权限问题_第1张图片

 /**
     * 判断是否是8.0,8.0需要处理未知应用来源权限问题,否则直接安装
     */
    private fun checkIsAndroidO() {
        if (Build.VERSION.SDK_INT >= 26) {//8.0
            //来判断应用是否有权限安装apk
            val installAllowed = packageManager.canRequestPackageInstalls()
            //有权限
            if (installAllowed) {
                //安装apk

            } else {
                //无权限 申请权限
                ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.REQUEST_INSTALL_PACKAGES),
                 INSTALL_APK_REQUESTCODE)
            }
        } else {//8.0以下
            //安装apk

        }
    }
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
             INSTALL_APK_REQUESTCODE -> {            
            //安装apk
                
            }
        }
    }

第二种效果图:直接跳转到“未知权限页面”进行授权安装

关于 Android 8.0 安装 APK 权限问题_第2张图片

    @RequiresApi(Build.VERSION_CODES.O)
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            INSTALL_APK_REQUESTCODE -> {
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //安装apk

                } else {
                    val packageURI = Uri.parse("package:$packageName")//设置包名,可直接跳转当前软件的设置页面
                    val intent = Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI)
                    startActivityForResult(intent, GET_UNKNOWN_APP_SOURCES)
                }
            }
        }
    }
  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            GET_UNKNOWN_APP_SOURCES -> {
                checkIsAndroidO()
            }
        }
    }

 

你可能感兴趣的:(Android)