我们在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
<provider android:name="android.support.v4.content.FileProvider" android:authorities="应用包名.FileProvider" android:exported="false" android:grantUriPermissions="true"> </provider>
2.在xml目录下创建file_paths文件
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_images" path="images/"/> </paths>
在file_paths文件夹内声明的都是需要对外共享的目录,比如上面的配置等于 new File(Context.getFilesDir(),"images") 路径