美文网首页Android技术知识Android开发Android开发
Android开发之高仿微信图片选择器

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

作者: 李晨玮 | 来源:发表于2018-10-01 02:02 被阅读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

    相关文章

      网友评论

      本文标题:Android开发之高仿微信图片选择器

      本文链接:https://www.haomeiwen.com/subject/cgsioftx.html