Android技术知识Android开发Android开发

Android开发之高仿微信图片选择器

2018-10-01  本文已影响62人  李晨玮

记得刚开始做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

上一篇下一篇

猜你喜欢

热点阅读