Android 拍照及相册选取图片功能,已适配Android6.0、7.0、8.0 2018年07月

更换头像或者上传图片功能已基本是每个 APP 所具备的基础功能了,但这对于开发者来说是一个很麻烦的事情,除机型之外,适配版本就至少要考虑这几种情况(6.0以下版本、6.0的动态权限、7.0的FileProvider、8.0的特殊情况)。


今天来个总结,方便自己也方便同行。


功能说明

本文的示例以下图为准: 

image.png


界面只有一个 ImageView,点击 ImageView 弹出 DialogFragment,分别是拍照和相册选择图片功能,其中都带有系统的裁剪功能,将裁剪后的图片显示在 ImageView 上。如果不需要裁剪功能,只需要将代码中的裁剪方法注释掉即可。 



6.0 以下版本

1. 权限

image.png

2. 拍照代码

image.png

其中 imgName 是拍照图片的名字,一般以时间戳再加上自定义字符串命名;CAMERA_RESULT_CODE 是自定义的一个常量,作为拍照的请求码。

onActivityResult 处理拍照后的图片

image.png

将拍照后的图片创建成一个 File 对象,用来裁剪,裁剪的功能代码是和相册选取图片通用的。

裁剪代码

image.png

其中的 CROP_RESULT_CODE 也是定义的静态常量,同拍照时定义的常量相同的作用。

如果裁剪时将 return-data 设置为 false,那么需要定义一个 Uri 来保存裁剪后的图片路径。


1  // 裁剪属性 cropIntent.putExtra("return-data", false); 时,使用自定义接收图片的Uri

2     private static final String IMAGE_FILE_LOCATION = "file:///" + Environment.getExternalStorageDirectory().getPath() + "/temp.jpg";

3     private Uri imageUri = Uri.parse(IMAGE_FILE_LOCATION);

图片裁剪完成回调

image.png

FileUtilcll 代码

image.png

image.png

到此,拍照功能就完成了,附带了裁剪。剩下的就是相册选取照片,这个也不难,固定代码,其他功能和拍照时相同的。

image.png

其中的 ALBUM_RESULT_CODE 同样是定义的常量。用来在 onActivityResult 中处理返回结果。

image.png

和拍照公用裁剪代码,这里直接调用即可,其他逻辑不变。 




6.0动态权限适配

除了上述功能保持不变之外,需要在代码中动态申请文件读写权限和相机权限。这里我将申请的时机写在了刚进入页面,而不是刚打开 APP,也不是点击按钮的时候。


逻辑


  • 如果用户点击了拒绝,但没有点击“不再询问”,这个时候再次进入界面继续弹框;

  • 如果用户点击了拒绝,且选择了“不再询问”,那么再次进入此界面将会弹框提示打开 APP 的详情界面,手动开启对应权限。


 权限申请代码


image.png

这里我将需要的权限统一写在了一个数组里面。其中的 REQUEST_PERMISSIONS 和上面拍照定义的常量功能相同。

权限申请回调

image.png

其中的 getAppDetailSettingIntent()方法代码如下:

image.png

到这,权限这个适配问题就解决了,接下来该是 Android 7.0 的适配了,这里我们只需要修改拍照的功能即可,相册是没有问题的。 




Android7.0 适配


Android 7.0 就是 File 路径的变更,需要使用 FileProvider 来做,下面看拍照的代码。


拍照代码修改

image.png

File 对象的创建和 拍照图片的 Uri 对象创建方式更改。创建原图像保存的代码如下:

image.png

拍照回调代码修改

image.png

getImageContentUri() 代码如下:

image.png

代码适配解决完了,还有一个 FileProvider 问题需要做如下配置。

  1. 在 res 目录下创建一个名为 xml 的文件夹,并在其下创建一个名为 file_paths.xml 文件,其内容如下:

image.png

image.png

其中这里的 android:authorities 属性值要和代码中 FileProvider.getUriForFile()的第二个参数值保持一致。 


注意


代码已全部给出,粘贴即可使用

本次测试真机:华为5.1.1,一加8.0.0 


总结

机型适配是个细活,但能锻炼排查问题和解决问题能力。

本文的代码有很多是可以抽取的,如果是在项目中使用,那么建议提取出特定功能的代码。


猜你喜欢

转载自blog.51cto.com/14009815/2298948