解决 android.os.FileUriExposedException异常

我们在Android 5.0以及5.0之前调用相机可以这样写

复制代码

Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
File savePhoto = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"/test/"+System.currentTimeMillis() + ".png");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(savePhoto));
startActivityForResult(intent,200);

到了6.0,在调用相机就得这样写
当我们开发者把sdk升级到了23后,这样写就会存在一点缺陷。那就是权限管理,需要动态进行获取了。OK,然后我们改成动态获取的,如下:

复制代码

if(checkSelfPermission(Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
    requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},200);
    return;
}
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
File savePhoto = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"/test/"+System.currentTimeMillis() + ".png");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(savePhoto));
startActivityForResult(intent,200);

这样写和5.0几乎没有区别,只是在前边加了一个权限校验。因为6.0到了动态权限时代

然而到了7.0,一切的一切都不一样了,因为Android 7.0不允许intent带有file://的URI离开自身的应用了,要不然会抛出FileUriExposedException

想要在自己应用和其他应用之间共享File数据,只能使用content://的方式
所以我们在想按照5.0和6.0的方式去调用相机是不可行的了,我们需要在7.0的时候。把所有应用与应用之间的文件传递改成content://的方式,并且还需要把该URI赋予临时的访问权限,使用如下:

1.现在清单文件里配置一个provider

复制代码


复制代码

 

2.在xml目录下创建file_paths文件


    

 

在file_paths文件夹内声明的都是需要对外共享的目录,比如上面的配置等于 new File(Context.getFilesDir(),"images") 路径

你可能感兴趣的:(android)