Android 6.0以上的APK安裝

關於 android 7.0 之前的 apk安裝,需要注意設置 Intent.FLAG_ACTIVITY_NEW_TASK 就好

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri apkUri = Uri.fromFile(file);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);

Android 7.x APK安裝
在 Android 7.0 引入了“私有目錄被限制訪問”,“StrictMode API 政策”。 Android 7.0 行爲變更

” StrictMode API 政策” 是指禁止向你的應用外公開 file:// URI。使用上述方法安裝APK時會出現 FileUriExposedException 異常。這個時候就需要使用FileProvider來解決這個問題:

步驟一 (FileProvider的申請),在Manifest.xml中定義一個FileProvider,代碼如下:

<provider
    android:name="android.support.v4.content.FileProvider" // 指向v4包裏的FileProvider類
    android:authorities="你的包名.FileProvider" // 對應你的content uri的基礎域名,生成的uri將以content://你的包名.FileProvider作爲開頭
    android:exported="false" // 設置不允許導出,我們的FileProvider應該是私有的
    android:grantUriPermissions="true"> // 設置允許獲取訪問文件的臨時權限
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/apk_provider_paths" /> // 用於設置FileProvider的文件訪問路徑
</provider>

步驟二 (創建 .xml),在res目錄新建xml文件夾,如圖所示
在這裏插入圖片描述
步驟三 (配置FileProvider文件共享的路徑),在 apk_provider_paths.xml文件中配置:

<?xml version="1.0" encoding="utf-8"?>

最後的安裝方式

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri apkUri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    // 授予文件操作的臨時權限,根據需求設定,一般安裝只需要READ權限
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);    
    intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    // 獲取配置的FileProvider的 Content Uri的值
    apkUri = FileProvider.getUriForFile(mContext
        , "你的包名.FileProvider"
        , file);
} else {
    apkUri = Uri.fromFile(file);
}
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(intent);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章