安卓7.0拍照遇到 Uri暴露错误
最近,項(xiàng)目又做到,調(diào)用攝像頭拍照獲取圖片這個功能。
用以前的代碼直接用,發(fā)現(xiàn)在Android7.0上使用時會出現(xiàn)問題。
Android6.0之后,動態(tài)申請權(quán)限已成常態(tài)。
調(diào)用攝像頭拍照獲取圖片這個功能,需要動態(tài)申請 照相機(jī)權(quán)限、SD卡讀寫權(quán)限。
可是加了這些權(quán)限后,還是會報(bào)錯。
錯誤:android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()
這個是uri暴露錯誤。
從Android?7.0開始,一個應(yīng)用提供自身文件給其它應(yīng)用使用時,如果給出一個file://格式的URI的話,應(yīng)用會拋出FileUriExposedException。這是由于谷歌認(rèn)為目標(biāo)app可能不具有文件權(quán)限,會造成潛在的問題。所以讓這一行為快速失敗。
網(wǎng)上有兩種解決方法:FileProvider方式 和?VmPolicy方式。
第一種是是谷歌官方推薦的解決方案,我這里也是采用第一種方法。
步驟:1.在AndroidManifest.xml中添加如下代碼
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package=""><application><providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.provider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"/></provider></application> </manifest> View Code? ? ? ? 2.在res目錄下新建一個xml文件夾,并且新建一個provider_paths的xml文件
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"><!--"."表示所有路徑--><external-path name="external_files" path="."/> </paths> View Code? ? ? ? 3.使用到uri的代碼
Uri photoURI = Uri.fromFile(createImageFile());變成:Uri photoURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", createImageFile()); View Code修改代碼后,再次調(diào)試,程序正常運(yùn)行。
?
ps:只是個小功能,網(wǎng)上也有不少資料,但還是自己總結(jié)一下比較好!
?
補(bǔ)充:按照以上步驟修改代碼之后,發(fā)現(xiàn):在4.4版本以下sdk運(yùn)行時,拍照返回報(bào)錯,所以,這里需要判斷sdk版本再做處理,當(dāng)sdk版本大于4.4時,使用以上方法;當(dāng)sdk版本小于等于4.4時,uri相關(guān)代碼不做修改。
轉(zhuǎn)載于:https://www.cnblogs.com/shenchanghui/p/6955744.html
總結(jié)
以上是生活随笔為你收集整理的安卓7.0拍照遇到 Uri暴露错误的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git提交到码云(转)
- 下一篇: Codeforces 550D. Reg