最近,項目又做到,調用攝像頭拍照獲取圖片這個功能。
用以前的代碼直接用,發現在Android7.0上使用時會出現問題。
Android6.0之后,動態申請權限已成常態。
調用攝像頭拍照獲取圖片這個功能,需要動態申請 照相機權限、SD卡讀寫權限。
可是加了這些權限后,還是會報錯。
這個是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 > <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest>
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>
3.使用到uri的代碼

Uri photoURI = Uri.fromFile(createImageFile());
變成:
Uri photoURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", createImageFile());
修改代碼后,再次調試,程序正常運行。
ps:只是個小功能,網上也有不少資料,但還是自己總結一下比較好!
補充:按照以上步驟修改代碼之后,發現:在4.4版本以下sdk運行時,拍照返回報錯,所以,這里需要判斷sdk版本再做處理,當sdk版本大於4.4時,使用以上方法;當sdk版本小於等於4.4時,uri相關代碼不做修改。