由于7.0上面添加了對(duì)文件訪問的限制,所以需要額外兼容魏蔗。Android 7.0強(qiáng)制啟用了被稱作 StrictMode的策略作喘,帶來的影響就是你的App對(duì)外無法暴露file://類型的URI了。
如果你使用Intent攜帶這樣的URI去打開外部App(比如:打開系統(tǒng)相機(jī)拍照)从媚,那么會(huì)拋出FileUriExposedException異常甘磨。
官方給出解決這個(gè)問題的方案橡羞,就是使用FileProvider:
一、 manifest.xml中的application節(jié)點(diǎn)下面添加配置
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.betiger.fileprovider" <!--自定義fileprovider济舆,類似schema卿泽,命名空間之類,后面會(huì)用到-->
android:grantUriPermissions="true" <!--申明為true滋觉,你才能獲取臨時(shí)共享權(quán)限-->
android:exported="false"> <!--false表示我們的provider不需要對(duì)外開放-->
<!--元數(shù)據(jù)-->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
二签夭、res目錄下新建xml目錄,添加file_paths.xml文件
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="download"
path="Driver" />
</paths>
說明:
name:一個(gè)引用字符串椎侠。
path:文件夾“相對(duì)路徑”第租,完整路徑取決于當(dāng)前的標(biāo)簽類型。
<files-path name="name" path="path" /> 相當(dāng)于Context.getFilesDir() + /path/我纪。
<cache-path name="name" path="path" />物理路徑相當(dāng)于Context.getCacheDir() + /path/慎宾。
<external-path name="name" path="path" />物理路徑相當(dāng)于Environment.getExternalStorageDirectory() + /path/儡羔。
<external-files-path name="name" path="path" />物理路徑相當(dāng)于Context.getExternalFilesDir(String) + /path/。
<external-cache-path name="name" path="path" />
物理路徑相當(dāng)于Context.getExternalCacheDir() + /path/璧诵。
三、安裝apk時(shí)調(diào)用
/**
* 安裝apk
*/
private void installSoft() {
File file = new File(Config.PathConfig.downloadFile() ,"driver.apk");
Intent intent = new Intent(Intent.ACTION_VIEW);
// 由于沒有在Activity環(huán)境下啟動(dòng)Activity,設(shè)置下面的標(biāo)簽
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if(Build.VERSION.SDK_INT>=24) { //判讀版本是否在7.0以上
//參數(shù)1 上下文, 參數(shù)2 Provider主機(jī)地址 和配置文件中保持一致 參數(shù)3 共享的文件
Uri apkUri = FileProvider.getUriForFile(mContext, "com.betiger.fileprovider", file);
//添加這一句表示對(duì)目標(biāo)應(yīng)用臨時(shí)授權(quán)該Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
}else{
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
}
mContext.startActivity(intent);
}