1. 程式人生 > >關於 Android 8.0 安裝 APK 許可權問題

關於 Android 8.0 安裝 APK 許可權問題

專案中在做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()
            }
        }
    }