安卓7.0拍照遇到 Uri暴露错误
最近,項目又做到,調用攝像頭拍照獲取圖片這個功能。
用以前的代碼直接用,發現在Android7.0上使用時會出現問題。
Android6.0之后,動態申請權限已成常態。
調用攝像頭拍照獲取圖片這個功能,需要動態申請 照相機權限、SD卡讀寫權限。
可是加了這些權限后,還是會報錯。
錯誤:android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()
這個是uri暴露錯誤。
從Android?7.0開始,一個應用提供自身文件給其它應用使用時,如果給出一個file://格式的URI的話,應用會拋出FileUriExposedException。這是由于谷歌認為目標app可能不具有文件權限,會造成潛在的問題。所以讓這一行為快速失敗。
網上有兩種解決方法: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修改代碼后,再次調試,程序正常運行。
?
ps:只是個小功能,網上也有不少資料,但還是自己總結一下比較好!
?
補充:按照以上步驟修改代碼之后,發現:在4.4版本以下sdk運行時,拍照返回報錯,所以,這里需要判斷sdk版本再做處理,當sdk版本大于4.4時,使用以上方法;當sdk版本小于等于4.4時,uri相關代碼不做修改。
轉載于:https://www.cnblogs.com/shenchanghui/p/6955744.html
總結
以上是生活随笔為你收集整理的安卓7.0拍照遇到 Uri暴露错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git提交到码云(转)
- 下一篇: Codeforces 550D. Reg