在Android7.0版本及7.0以上的手機(jī)上按照傳統(tǒng)的寫法會拋出一個(gè)FileUriExposedException異常根时,這是因?yàn)?.0的版本改了一些東西久信,在獲取相機(jī)或相冊的圖片中的Uri時(shí)陡叠,即file://URI開頭的Uri離開了相機(jī)或相冊應(yīng)用呀舔,就會觸發(fā)7.0文件uri權(quán)限 FileUriExposedException特碳。在網(wǎng)上也查閱了一些資料蹋岩,谷歌推薦的解決方式是使用FileProvider外恕。
第一步:配置provider
在AndroidManifest.xml中的application標(biāo)簽中添加以下代碼:
注意:不管你是在主項(xiàng)目下調(diào)用相機(jī)還是在library中調(diào)用相機(jī)杆逗,都可以在主項(xiàng)目下配置即可,只要包名一致就不會異常鳞疲。罪郊。
<provider
android:name="android.support.v4.content.FileProvider" //固定值
android:authorities="包名.fileprovider"http://包名.fileprovider,包名寫自己的
android:exported="false"http://必須為flase
android:grantUriPermissions="true">//必須為true
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"http://固定值
android:resource="@xml/file_paths"/>//在res目錄下定義的file_paths.xml文件尚洽,名字可以自定義
</provider>
第二步:配置file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="camera_photos" path="." /> //.代表任意目錄
<external-path name="cache" path="Android/data/包名/cache" /> //這里包名寫成你自己的
<external-path name="images" path="Pictures/" />
<external-path name="dcim" path="DCIM/" />
</paths>
第三步:判斷Android版本悔橄,分別調(diào)用
private File mTmpFile;
//開始調(diào)用相機(jī)
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
try {
mTmpFile = FileUtils.createTmpFile(getActivity());
} catch (IOException e) {
e.printStackTrace();
}
if (mTmpFile != null && mTmpFile.exists()) {
//適配Android7.0版本調(diào)用相機(jī) API24
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Log.i("TAG", "Android7.0以及7.0版本以上的手機(jī)");
Uri uriForFile = FileProvider.getUriForFile(getActivity()
, "包名.fileprovider", mTmpFile);//這里包名寫自己的
intent.putExtra(MediaStore.EXTRA_OUTPUT, uriForFile);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} else {
Log.i("TAG", "Android7.0以下版本的手機(jī)");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
}
startActivityForResult(intent, REQUEST_CAMERA);
} else {
Toast.makeText(getActivity(), "圖片錯(cuò)誤", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getActivity(), "沒有系統(tǒng)相機(jī)", Toast.LENGTH_SHORT).show();
}
OK,這樣在7.0以上和以下的手機(jī)上調(diào)用都不會崩潰報(bào)異常了腺毫,在這里做個(gè)總結(jié)癣疟,希望幫助更多的碼農(nóng)避免踩坑!3本啤睛挚!