版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36707431/article/details/81774055
项目中在做App应用内更新的时候,发现Android8.0以上的手机下载安装包之后,闪屏一下,无法启动安装页面进行安装。
通过查阅资料发现,大多数潜在有害应用都来源于第三方平台,Android引入 Google Play 保护机制,保护用户设备免受侵害。在 Android 8.0 中,安装未知应用权限提高了安装未知来源应用时的安全性。此权限与其他运行时权限一样,会与应用绑定,在安装时进行提示,确保用户授予使用安装来源的权限后,此权限才会提示用户安装应用。在运行 Android 8.0 或更高版本的设备上使用此权限时,恶意下载程序将无法骗取用户安装未获得预先授权的应用。
如果你想要安装某个被自己所信任的开发者的 app,则需要在每一次都手动授予“安装未知应用”权限的许可。
首先在清单文件中添加未知应用的权限:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
其次就是正常的申请敏感权限:
第一种效果图:每次都去授权安装
/**
* 判断是否是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<out String>, 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<out String>, 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()
}
}
}