Android开发之高仿微信图片选择器
记得刚开始做Andriod项目那会,经常会碰到一些上传图片的功能需求,特别是社交类的app,比如用户头像,说说配图,商品配图等功能都需要让我们到系统相册去选取图片,但官方却没有提供可以选取多张图片的相关API,所以那时候会到Github上去找找相关的开源库,也觉得挺方便的,但随着后来Android系统的更新,带来了很多新特性和API的改变,比如从Android6.0后的动态权限申请,7.0的私有目录权限以及一些API的废弃(Uri.fromFile等),但所用的开源库作者又没有很及时的去更新适配,又或者一些开源库直接在库中引入了图片加载框架,导致项目中存在多个图片加载框架,这样就造成了包体积的增大和方法数的增加,导致项目中或多或少会出现一些问题,所以那时萌生了想自己写一个图片选择器,尽可能的做到简洁,速度快,然后一个图片选择器的库就这么诞生了:ImagePicker图片加载器
实现效果图:
效果图1效果图2
效果图3
使用方式:
1、在项目下的build.gradle文件中引入(注意gradle的版本):
//gradle版本在3.0以下引入此行
compile 'com.lcw.library:imagepicker:1.0.1'
//gradle版本在3.0以上引入此行
implementation 'com.lcw.library:imagepicker:1.0.1'
2、然后需要在AndroidManifest.xml里声明组件:
<application>
....
<!--图片选择器的主Activity-->
<activity
android:name="com.lcw.library.imagepicker.activity.ImagePickerActivity"
android:screenOrientation="portrait" />
...
</application>
3、调用方式非常简单,只需要简单一行代码:
ImagePicker.getInstance()
.setTitle("标题")//设置标题
.showCamera(true)//设置是否显示拍照按钮
.setMaxCount(9)//设置最大选择图片数目(默认为1,单选)
.setImageLoader(new GlideLoader())//设置自定义图片加载器
.start(mContext, REQUEST_SELECT_IMAGES_CODE);//REQEST_SELECT_IMAGES_CODE为Intent调用的requestCode
4、获取选择图片返回的数据:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SELECT_IMAGES_CODE && resultCode == RESULT_OK) {
List<String> imagePaths = data.getStringArrayListExtra(ImagePicker.EXTRA_SELECT_IMAGES);
}
}
5、关于自定义图片加载器,不具体指定图片加载框架,让开发者更加灵活的定制,只需要去实现ImageLoader接口即可:
public class GlideLoader implements ImageLoader {
@Override
public void loadImage(ImageView imageView, String imagePah) {
//小图加载,这里以Glide图片加载框架为例
RequestOptions options = new RequestOptions()
.centerCrop()
.placeholder(R.mipmap.icon_image_default)
.error(R.mipmap.icon_image_error);
Glide.with(imageView.getContext()).load(imagePah).apply(options).into(imageView);
}
}
6、关于权限,6.0以后危险权限需要动态申请,不了解的同学可以看下我之前写过的一篇文章《适配Android6.0动态权限管理》,由于国内各大厂商的ROM存在差异化,需要经常处理一些兼容上的问题,也有比较成熟的开源库,为了简洁,本Library就不提供此功能,请开发者自行处理,所需权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
7、最后需要注意的是在Android7.0后私有目录被限制访问,这里做了兼容处理,在开启拍照按钮的时候需要注意:
(1)首先需要在AndroidManifest.xml里声明组件:
<application>
....
<!-- Android 7.0 文件共享配置 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.lcw.library.imagepicker.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/image_picker" />
</provider>
....
</application>
(2)然后在res文件夹下建立一个xml文件夹,放置xml文件(image_picker.xml)即可,xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="imagePicker"
path="" />
</paths>
8、其他:
根据业务的需求,有时候我们在选择一部分图片后,再次跳转图片选择器的时候,想要去保存已经勾选的图片状态,这边也提供了对应的方法,只需要把onActivityResult返回的图片路径List集合,重新设置进来即可,代码如下:
ImagePicker.getInstance()
.setTitle("标题")
.showCamera(true)
.setMaxCount(9)
.setImagePaths(mImagePaths)//设置list
.setImageLoader(new GlideLoader())
.start(MainActivity.this, REQUEST_SELECT_IMAGES_CODE);
写在最后:
这个库会持续维护下去,后续会把大图预览,裁剪等功能添加进去,遵循极简的原则,把库做的尽可能的小,欢迎大家提建议,更加具体的使用请参考下面源码中的Demo演示~
源码下载:
这里附上源码地址(欢迎Star,欢迎Fork):ImagePicker