文档章节

android多图选择器

lucklykjs
 lucklykjs
发布于 2017/04/30 15:50
字数 1497
阅读 23
收藏 2
点赞 0
评论 0

PictureSelector

最近项目中用到多图选择上传的需求,考虑到android机型众多问题就自己花时间写了一个,测试了大概60款机型,出现过一些问题也都一一修复了,基本上稳定了特分享出来,界面UI也是商用级的开发者不用在做太多修改了,界面高度自定义,可以设置符合你项目主色调的风格,集成完成后就可以拿来用。

项目会一直维护,发现问题欢迎提出会第一时间修复,QQ交流群 619458861,个人QQ 893855882@qq.com  希望用得着的朋友点个start。 

https://github.com/LuckSiege/PictureSelector

 PRs Welcome CSDN I Star

功能特点:

  1.适配android6.0+系统
  2.解决部分机型裁剪闪退问题
  3.解决图片过大oom闪退问题
  4.动态获取系统权限,避免闪退
  5.支持相片or视频的单选和多选
  6.支持裁剪比例设置,如常用的 1:1、3:4、3:2、16:9 默认为图片大小
  7.支持视频预览
  8.支持gif图片
  9.支持.webp格式图片
  10.支持一些常用场景设置:如:是否裁剪、是否预览图片、是否显示相机等
  11.新增自定义主题设置
  12.新增图片勾选样式设置
  13.新增图片裁剪宽高设置
  14.新增图片压缩处理
  15.新增录视频最大时间设置
  16.新增视频清晰度设置
  17.新增QQ选择风格,带数字效果
  18.新增自定义 文字颜色 背景色让风格和项目更搭配
  19.新增多图裁剪功能
  20.新增LuBan多图压缩
  21.新增单独拍照功能
  22.新增压缩大小设置
  23.新增Luban压缩档次设置
    

那些遇到拍照闪退问题的同学,请记得看清下面适配6.0的配置~

重要的事情说三遍记得添加权限

  <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" />
    

注:适配android6.0以上拍照问题,请在AndroidManifest.xml中添加标签

<provider
   android:name="android.support.v4.content.FileProvider"
   android:authorities="${applicationId}.provider"
   android:exported="false"
   android:grantUriPermissions="true">
     <meta-data
         android:name="android.support.FILE_PROVIDER_PATHS"
         android:resource="@xml/file_paths" />
</provider>

集成步骤

方式一 compile引入

dependencies {
    compile 'com.github.LuckSiege.PictureSelector:picture_library:v1.4.1'
}

方式二 maven引入

step 1.

<repositories>
       <repository>
       <id>jitpack.io</id>
	<url>https://jitpack.io</url>
       </repository>
 </repositories>

step 2.

<dependency>
      <groupId>com.github.LuckSiege.PictureSelector</groupId>
      <artifactId>picture_library</artifactId>
      <version>v1.4.1</version>
</dependency>

项目根目录  

allprojects {
   repositories {
      jcenter()
      maven { url 'https://jitpack.io' }
   }
}

常见错误*

 问题一:
 rxjava冲突:在app build.gradle下添加
 packagingOptions {
   exclude 'META-INF/rxjava.properties'
 }  
 
 问题二:
 java.lang.NullPointerException: 
 Attempt to invoke virtual method 'android.content.res.XmlResourceParser 
 android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)'
 on a null object reference
 
 application下添加如下节点:
 
 <provider
      android:name="android.support.v4.content.FileProvider"
      android:authorities="${applicationId}.provider"
      android:exported="false"
      android:grantUriPermissions="true">
       <meta-data
         android:name="android.support.FILE_PROVIDER_PATHS"
         android:resource="@xml/file_paths" />
</provider>

注意:如已添加其他sdk或项目中已使用过provider节点,
[请参考我的博客](http://blog.csdn.net/luck_mw/article/details/54970105)的解决方案

问题三:
PhotoView 库冲突,可以删除自己项目中引用的,Picture_library中已经引用过,或引用com.commit451:PhotoView:1.2.4版本
 

相册启动构造方法

FunctionOptions options = new FunctionOptions.Builder()
        .setType(selectType) // 图片or视频 FunctionConfig.TYPE_IMAGE  TYPE_VIDEO
        .setCropMode(copyMode) // 裁剪模式 默认、1:1、3:4、3:2、16:9
        .setCompress(isCompress) //是否压缩
        .setEnablePixelCompress(true) //是否启用像素压缩
        .setEnableQualityCompress(true) //是否启质量压缩
        .setMaxSelectNum(maxSelectNum) // 可选择图片的数量
        .setSelectMode(selectMode) // 单选 or 多选
        .setShowCamera(isShow) //是否显示拍照选项 这里自动根据type 启动拍照或录视频
        .setEnablePreview(enablePreview) // 是否打开预览选项
        .setEnableCrop(enableCrop) // 是否打开剪切选项
        .setPreviewVideo(isPreviewVideo) // 是否预览视频(播放) mode or 多选有效
        .setCheckedBoxDrawable(checkedBoxDrawable)
        .setRecordVideoDefinition(FunctionConfig.HIGH) // 视频清晰度
        .setRecordVideoSecond(60) // 视频秒数
        .setGif(false)// 是否显示gif图片,默认不显示
        .setCropW(cropW) // cropW-->裁剪宽度 值不能小于100  如果值大于图片原始宽高 将返回原图大小
        .setCropH(cropH) // cropH-->裁剪高度 值不能小于100 如果值大于图片原始宽高 将返回原图大小
        .setMaxB(maxB) // 压缩最大值 例如:200kb  就设置202400,202400 / 1024 = 200kb左右
        .setPreviewColor(previewColor) //预览字体颜色
        .setCompleteColor(completeColor) //已完成字体颜色
        .setPreviewBottomBgColor(previewBottomBgColor) //预览底部背景色
        .setBottomBgColor(bottomBgColor) //图片列表底部背景色
        .setGrade(Luban.THIRD_GEAR) // 压缩档次 默认三档
        .setCheckNumMode(isCheckNumMode)
        .setCompressQuality(100) // 图片裁剪质量,默认无损
        .setImageSpanCount(4) // 每行个数
        .setSelectMedia(selectMedia) // 已选图片,传入在次进去可选中,不能传入网络图片
        .setCompressFlag(compressFlag) // 1 系统自带压缩 2 luban压缩
        .setCompressW(compressW) // 压缩宽 如果值大于图片原始宽高无效
        .setCompressH(compressH) // 压缩高 如果值大于图片原始宽高无效
        .setThemeStyle(themeStyle) // 设置主题样式
        .create();     

启动相册并拍照      

 PictureConfig.getInstance().init(options).openPhoto(mContext, resultCallback);
 
 或默认配置
 PictureConfig.getInstance().openPhoto(mContext, resultCallback);

单独启动拍照或视频 根据type自动识别      

 PictureConfig.getInstance().init(options).startOpenCamera(mContext, resultCallback);
 
 或默认配置
 PictureConfig.getInstance().startOpenCamera(mContext, resultCallback);

预览图片      

 PictureConfig.getInstance().externalPicturePreview(mContext, position, selectMedia);

预览视频

PictureConfig.getInstance().externalPictureVideo(mContext, selectMedia.get(position).getPath());

图片回调完成结果返回

  private PictureConfig.OnSelectResultCallback resultCallback = new PictureConfig.OnSelectResultCallback() {
        @Override
        public void onSelectSuccess(List<LocalMedia> resultList) {
            selectMedia = resultList;
            Log.i("callBack_result", selectMedia.size() + "");
            LocalMedia media = resultList.get(0);
            if (media.isCut() && !media.isCompressed()) {
                // 裁剪过
                String path = media.getCutPath();
            } else if (media.isCompressed() || (media.isCut() && media.isCompressed())) {
                // 压缩过,或者裁剪同时压缩过,以最终压缩过图片为准
                String path = media.getCompressPath();
            } else {
                // 原图地址
                String path = media.getPath();
            }
            if (selectMedia != null) {
                adapter.setList(selectMedia);
                adapter.notifyDataSetChanged();
            }
        }
    };
    

更新日志:

版本 v1.4.1

1.修复单选快速点击重复bug

2.重命名string资源文件

========================================================

历史版本***

版本 v1.4.0

1.减小引入大小

版本 v1.3.9

1.修改相册启动方式

2.修复.webp格式图片压缩后后缀变为.jpg格式问题

3.修复多图裁剪快速点击,结果返回为空问题

4.修复快速点击启动相册重复问题

5.将activity通信由广播改为EventBus3.0

6.修复多图裁剪压缩bug

项目使用第三方库:

1.裁剪使用ucrop库

2.eventbus:3.0.0'

3.glide:3.7.0

4.rxjava:2.0.5

5.rxandroid:2.0.1

6.okhttp:3.2.0

7.PhotoView:1.2.4

8.Luban

兼容性测试:

腾讯优测-深度测试-通过率达到100%

image

演示效果:

image image image image image image image image image image

© 著作权归作者所有

共有 人打赏支持
lucklykjs
粉丝 1
博文 2
码字总数 1837
作品 0
杨浦
android清理缓存动画、天气APP、购物下单选择器、阅读APP、饿了么demo等源码

Android精选源码 android将文本内容局部变颜色代码(http://www.apkbus.com/thread-597560-1-1.html) Android遮罩对比图效果组件(http://www.apkbus.com/thread-597563-1-1.html) 一个能让你了...

逆鳞龙
04/17
0
0
react native之第三方库的相册相机(可裁剪可压缩等)等操作

第三方库的原生相册相机操作。第三方的react-native-image-crop-picker的功能更为完整易用(可多选、压缩、裁剪等)。 https://github.com/ivpusic/react-native-image-crop-picker //GitHub...

Chason-洪
2017/10/18
0
0
Android零基础入门第86节:探究Fragment生命周期

一个Activity可以同时组合多个Fragment,一个Fragment也可被多个Activity 复用。Fragment可以响应自己的输入事件,并拥有自己的生命周期,但它们的生命周期直接被其所属的Activity的生命周期...

鑫鱻
2017/10/30
0
0
android 常用第三方插件收藏

1、android-vertical-slide-view : 仿照淘宝和聚美优品,在商品详情页,向上拖动时,可以加载下一页。使用ViewDragHelper,滑动比较流畅。 2、Android-MaterialRefreshLayout :这是一个下拉...

ch10mmt
06/26
0
0
功能模块一之颜色选择器【ColorPickerPreference】自定义Preference...

在Api Demo里面有一个叫ColorPickerDialog的对话框,该对话框扩展了Dialog 的功能,使其具备颜色选择器的功能。具体可以参考Api Demo源代码,路径为:android-sdk-windowssamplesandroid-7Ap...

黑菜妞妞
2011/08/15
0
3
Android零基础入门第84节:引入Fragment原来是这么回事

随着大众生活水平的提高,再加上移动互联网的迅速发展,几乎每个人都至少拥有一台搭载Android系统的移动设备。Android设备的多样性给我们带来了很大的便捷,各Android设备拥有不同分辨率和不...

鑫鱻
2017/10/26
0
0
android的多分辨率支持机制 由anyDensity设置导致OpenGL贴图

前段时间给员工做培训,做了不少OpenGL下面的Demo,不过onSurfaceChanged 获取的width 和height和屏幕尺寸适中不符合 终于找到了 <supports-screens android:anyDensity="true"/> 设置,获取...

冯京宝
2012/09/22
0
0
Android中View绘制不同状态背景图片原理

先看一下listview中的状态: 把下面的XML文件保存成你自己命名的.xml文件(比如listitembg.xml),在系统使用时根据ListView中的列表项的状态来使用相应的背景图片。drawable/item_bg.xml ja...

广阔
2013/02/18
0
0
Android设计应用图标不用愁---Asset Studio Integration来帮你 .

2011-11-12 00:181295人阅读评论(6)收藏举报 Android Asset Studio Web版是一个非常好用的Andrid图标资源设计工具,它是由Roman Nurik开发的。 现在我们已经在ADT14里支持同样的功能。首先,...

qjami
2012/06/05
0
0
Android UI:XML文件配置按钮等背景方案

(1)在开发中,我们经常会遇到一些纯色或带边框的简单样式的按钮或div,很多时候,都是用九宫格的背景图片来贴上去。但仔细想来,使用图片也带来了一些性能上的问题,包括过多的图片文件会导...

古沐风
2014/01/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
7分钟前
0
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
16分钟前
0
0
设计模式:代理模式

代理模式可以分为三种:静态代理,动态代理,cglib代理 1.静态代理:被代理的类需要实现一接口或是继承一父类 委托类(被代理的类): package com.java.pattern.proxy.staticdemo;publ...

人觉非常君
19分钟前
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
25分钟前
0
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
25分钟前
0
0
TensorFlow,从一个 Android Demo 开始

TensorFlow Android Demo 项目地址 Machine Learning 既然提到了 TensorFlow,那是不是得神经网络、机器学习了解下? 如果你能坚持把 机器学习速成课程 给啃完了,觉得还挺有兴趣的,那可以考...

孟飞阳
27分钟前
0
0
JVM学习笔记二:内存结构规范

1、JVM基本结构图 2、java堆(Heap) 3、方法区(Method Area) 4、程序计数器 5、JAVA栈图解 局部变量表:八大基本类型,还可以存储引用类型 上一篇:JVM学习笔记一:类加载机制介绍...

刘祖鹏
32分钟前
0
0
mui集成微信H5支付(返回白屏问题已经解决)

一.项目需求 因为公司人员缺少,没有专门开发安卓和ios的人员,为了项目尽早上线采用了混合APP开发的方式,我选择了MUI混合开发框架,项目中需要在用户购买VIP会员的时候进行支付,所以需要在项目...

银装素裹
36分钟前
0
0
SpringBoot集成Redis--配置自定义的RedisCacheManager

配置自定义的RedisCacheManager--1自定义键生成规则 默认的键生成器 当不指定缓存的key时,SpringBoot会使用SimpleKeyGenerator生成key。 SimpleKeyGenerator SimpleKey 查看源码可以发现,它...

karma123
55分钟前
0
0
防火墙未来的发展趋势在哪里?

导读 防火墙(Firewall),也称防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网。当下互联网时代,无论是大小企业,大部分都会部署有防火墙的设备,但这些防火墙往往并不...

问题终结者
58分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部