關於 Android 8.0 安裝 APK 許可權問題
阿新 • • 發佈:2019-02-16
專案中在做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()
}
}
}