Android 7.0相机遇到的一些问题记录,在网上看了好久,主要是之前没有怎么解除过,所以看起来挺费劲,没有一个
系统的介绍,所以看起来一脸懵逼,然后在书上查了一下,很简单的搞定问题,没有太多的原理详解,以解决问题为核心,
现分享记录,亲测可用.
(1):
File outputImage = new File(getExternalCacheDir(),"iv_photo_regidter.jpg");
try {
//创建文件夹
if(outputImage.exists()){
outputImage.delete();
}
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT>=24){
imageUri1 = FileProvider.getUriForFile(this,"net.xxxxxxxx.fileprovider",outputImage);
}else{
imageUri1 = Uri.fromFile(outputImage);
}
//启动相机
Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
i.putExtra(MediaStore.EXTRA_OUTPUT,imageUri1);
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(i,Flag);
首先创建一个File,并指定照片的存储路径,getExternalCacheDir()获取手机SD卡的应用相关联目录,为什么要使
用应用相关联目录呢,因为在Android 6.0 后,SD卡被定义在危险权限中,访问相机需要申请运行时权限,获取应用
相关联目录就可以跳过这一步,FileProvider是Android的一个特殊的内容提供器,它使用了和内容提供器类似的机制
来对数据进行保护,提高了安全性.
这个大家都明白的,但是在指定Uri的时候要进行判断是否是7.0相机,小于7.0版本相机的处理方式并没有什么变化;注意7.0相机的路径,需要调用 FileProvider.getUriForFile();第一个
参数是上下文,第二个参数是一个任意的字符串 + .fileprovider
(注意,这个在后面有用到),第三个参数是file对象,最后得到一个路径
,就是7.0相机照片保存的最终路径,意图调用相机就不赘述了.因为是startActivityForResult隐式意图调用相机,
照片拍摄完成会保存在output.jsp,再调用(7.0相机这样调用拿到相片,见操作(2))
(2): BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri1));得到这张图片,
(3): 然后需要在清单文件中进行注册内容提供器,
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="net.xinyongfu.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
provider内的相关属性,authrities:属性是你可以自定义的任意字符串 .fileprovider ,但是必须和刚才
FileProvider.getUriForFile();里面的第二个参数是完全一致的;name:是固定的,exported必须是false,
grantUriPermissions 必须是true,meta-data 里面的属性name 属性是固定的,resource里面引用了一个xml资源,现在这个资源是不存在的,下面开始
创建,右击res目录->New->Directory,创建一个xml目录,右击xml创建一个file,下面是xml里面的代码示例(4):
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path=""/>
</paths>name可以随便写,path= "",代表将整个SD卡目录进行共享,但是在Android4.0系统之前,还是要在清单文件中申明访问SD卡的权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />这样代码就写完了,注意:四步操作,缺一不可,相关API方法调用都是实现这个功能的基础.