解決Android 7.0, 8.0手機相機崩潰問題
阿新 • • 發佈:2018-12-06
在android 7.0之後的手機上用以上程式碼開啟相機、相簿會報如下錯誤:
android.os.FileUriExposedException: ** exposed beyond app through Intent.getData()
解決方法:
1、在manifest清單檔案中註冊provider
- <provider
- android:name="android.support.v4.content.FileProvider"
- android:authorities="包名.fileprovider"
- android:grantUriPermissions="true"
- android:exported="false">
- <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
- android:resource="@xml/file_paths" />
- </provider>
也就是在application內加了一個provider:
- name是固定的;
- android:authorities推薦寫您的應用包名+“.fileprovider”,其實這裡不一定要寫fileprovider,您也可以隨便寫,只要與後面使用FileProvider.getUriForFile()這個方法中的第二個引數authority對應起來即可;
- android:grantUriPermissions固定true,表示uri訪問授權;
- android:exported固定的false,我試著寫了true報安全異常。
- android:resource表示我們app要共享檔案的路徑的資原始檔。
- 2.res資料夾下,新建一個xml資料夾,名字就是上一步 android:resource=”@xml/file_paths”對應的內容
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <paths>
- <external-path path="" name="camera_photos" />
- </paths>
- </resources>
- <paths>
ps:另外發現嚴苛模式(StrictMode)也可以避免這個FileUriExposedException問題,在您的Application中OnCreate()方法中加入以下程式碼即可。這樣您可以按照7.0之前方法呼叫相機。
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
- { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
- StrictMode.setVmPolicy(builder.build());
- }
但畢竟這方法不是官方推薦的,所以知道就行,不建議使用