最近,項目又做到,調用攝像頭拍照獲取圖片這個功能。 用以前的代碼直接用,發現在Android7.0上使用時會出現問題。 Android6.0之後,動態申請許可權已成常態。 調用攝像頭拍照獲取圖片這個功能,需要動態申請 照相機許可權、SD卡讀寫許可權。 可是加了這些許可權後,還是會報錯。 錯誤:android ...
最近,項目又做到,調用攝像頭拍照獲取圖片這個功能。
用以前的代碼直接用,發現在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>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:只是個小功能,網上也有不少資料,但還是自己總結一下比較好!