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

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

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


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

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

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

 /**     * 判断是否是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                            }        }    }

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

    @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()            }        }    }

 

更多相关文章

  1. iOS自动化测试(一)-技术方案、环境配置与疯狂踩坑
  2. Android(安卓)版本更新下载自动安装APK,并解决Android6.0安装失败
  3. 也谈Android下一个apk安装多个程序入口图标
  4. 给android studio安装新字体,如mac系统的monaco字体
  5. Android实现电话拨号器和短信发送器
  6. Android(安卓)Q(10.0)版本新特性和兼容性适配
  7. 移动互联网和Android给你带来的机会[轉]
  8. Android(安卓)Studio打不开,无法启动,无反应的解决方案
  9. Android学习系列(3)--App自动更新之自定义进度视图和内部存储

随机推荐

  1. 初识JavaScript的基础
  2. 浅谈Vue3的几个优势
  3. 【北亚数据恢复】企业如何避免服务器数据
  4. 不联网的情况下,使用 electron-builder 快
  5. 解决vue中less的使用问题
  6. JavaScript实现进度条效果
  7. React中10种Hook的使用介绍
  8. JS实现元素的拖动与占位功能
  9. JS实现元素的拖动与占位功能
  10. JavaScript实现搜索的数据显示