1. 程式人生 > >Android 8.0 安裝APK

Android 8.0 安裝APK

因為8.0添加了新的安全措施,不允許應用內安裝未經過Google play驗證的應用,但是又有更新應用的需求

那麼首先要加入許可權

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
新增provider
<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.mydomain.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            ...
        </provider>
       <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
    </application>
</manifest>
在resources資料夾中新增一個xml資料夾,名字對應file_paths,在file_paths中新增
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_storage_root" path="." />
</paths>
path="."其實是對應外接SD卡的根目錄

原文在此:https://developer.android.com/reference/android/support/v4/content/FileProvider.html

判斷是否有許可權    
val REQUEST_INSTALL_PACKAGES = 3
override fun onCreate(savedInstanceState: Bundle?) {
...
requestPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES, REQUEST_INSTALL_PACKAGES)
...
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        when (requestCode) {
            REQUEST_INSTALL_PACKAGES->startActivity(Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES))
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }
   protected fun requestPermission(permission: String, requestCode: Int) {
        if (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED || !packageManager.canRequestPackageInstalls()
        } else {
            ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED
        }) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
                ActivityCompat.requestPermissions(this, arrayOf(permission), requestCode)
            } else {
                ActivityCompat.requestPermissions(this, arrayOf(permission), requestCode)
            }
        } else {
            //直接執行操作
            when (requestCode) {
                REQUEST_INSTALL_PACKAGES -> //執行安裝操作
            }
        }
    }
packageManager.canRequestPackageInstalls()這一行用於判斷是否已經獲取到允許安裝未知應用,返回值Boolean