先上解决方法
方法一:
需要在oncreate()函数中添加如下方法即可解决
private void initPhotoError(){
// android 7.0系统解决拍照的问题
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
builder.detectFileUriExposure();
}
方法二:
Uri imageUri;
if (Build.VERSION.SDK_INT >= 24){
imageUri = FileProvider.getUriForFile(MainActivity.this,
"com.example.test.fileprovider",outputImage);
}else {
imageUri = Uri.fromFile(outputImage);
}
记得在AndroidManifest文件中添加
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.testnotifity.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
如果没有@xml/file_paths文件,可以在res文件夹下新建一个xml文件夹,在xml文件夹里新建一个file_paths文件
file_paths文件:
<paths>
<external-path
path="Android/data/${applicationId}/"
name="files_root" />
<external-path
path="."
name="external_storage_root" />
</paths>
Android7.0及以上版本调用照相机拍照可能会造成闪退并报FileUriExposedException异常:
在Android7.0以下,以fill://格式的uri包含着文件的真实路径;而在Android7.0版本开始;直接使用本地真实的Uri路径被认为是不安全的,这是由于Google认为目标app可能不具有文件权限;会造成潜在问题,所以会抛出FileUriExposedException异常,
FileProvider是一种特殊的内容提供器,它使用了类似内容提供器类似的机制来对数据进行保护,可选择性的将封装过得Uri共享给外部,从而提高了应用的安全性