原因 :?
Android7.0又引入“私有目錄被限制訪問”姆另,“StrictMode API 政策”。
解釋:
私有目錄被限制訪問“ 是指在Android7.0中為了提高私有文件的安全性,面向 Android N 或更高版本的應(yīng)用私有目錄將被限制訪問栈暇。這點(diǎn)類似iOS的沙盒機(jī)制唉俗。
" StrictMode API 政策" 是指禁止向你的應(yīng)用外公開 file:// URI陌凳。 如果一項(xiàng)包含文件 file:// URI類型 的 Intent 離開你的應(yīng)用嗓蘑,應(yīng)用失敗须肆,并出現(xiàn) FileUriExposedException 異常。
解決方法:
使用FileProvider解決上述異常
步驟:
1. 聲明FileProvider,這里是自己實(shí)現(xiàn)一個(gè)子類,子類為空class
聲明FileProvider
? ? exported:要求必須為false桩皿,為true則會(huì)報(bào)安全異常休吠。
? ? grantUriPermissions:true,表示授予 URI 臨時(shí)訪問權(quán)限业簿。
? ? authorities組件標(biāo)識(shí),按照江湖規(guī)矩,都以包名開頭,避免和其它應(yīng)用發(fā)生沖突阳懂。
2. 指定共享目錄? "@xml/provider_paths"
注意:
上述代碼中path=""梅尤,是有特殊意義的,它代碼根目錄岩调,也就是說你可以向其它的應(yīng)用共享根目錄及其子目錄下任何一個(gè)文件了巷燥。
如果你將path設(shè)為path="pictures",那么它代表著根目錄下的pictures目錄(eg:/storage/emulated/0/pictures)号枕,如果你向其它應(yīng)用分享pictures目錄范圍之外的文件是不行的缰揪。
3.定義ProviderUtil
4.調(diào)用代碼以安裝應(yīng)用為例 (7.0以上修改路徑,以下正常)
補(bǔ)充:
? files-path? --表示Context.getFilesDir()目錄或者其子目錄。 -- ? 示例: /data/data/com.chen.gradle/files/test1
cache-path--表示Context.getCacheDir()目錄或者其子目錄。--示例: /data/data/com.chen.gradle/cache/test2
external-path--表示Environment.getExternalStorageDirectory()目錄或者其子目錄钝腺。--示例: /storage/emulated/0/test3
external-files-path--表示Context.getExternalFilesDir(null)目錄或者其子目錄。--示例:/storage/emulated/0/Android/data/com.chen.gradle/files/test4
external-cache-path--表示Context.getExternalCacheDir()目錄或者其子目錄。--示例: /storage/emulated/0/Android/data/com.chen.gradle/cache/test5