最近之前的項目有客戶反應設置頭像,選取文件有問題,了解情況發現是Android 7.0系統會有問題,今天就來分享一下解決辦法
Android6.0之后,動態申請權限已成常態。
調用攝像頭拍照獲取圖片這個功能,需要動態申請 照相機權限、SD卡讀寫權限。
可是加了這些權限后,還是會報錯。
從Android 7.0開始,一個應用提供自身文件給其它應用使用時,如果給出一個file://格式的URI的話,應用會拋出FileUriExposedException。
網上有兩種解決方法: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());
修改代碼后,再次調試,程序正常運行。