PictureSelector

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

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

github代码地址

    

功能特点:

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

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

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

  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  3. <uses-permission android:name="android.permission.CAMERA" />

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

  1. <provider
  2. android:name="android.support.v4.content.FileProvider"
  3. android:authorities="${applicationId}.provider"
  4. android:exported="false"
  5. android:grantUriPermissions="true">
  6. <meta-data
  7. android:name="android.support.FILE_PROVIDER_PATHS"
  8. android:resource="@xml/file_paths" />
  9. </provider>

集成步骤

方式一 compile引入

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

方式二 maven引入

step 1.

  1. <repositories>
  2. <repository>
  3. <id>jitpack.io</id>
  4. <url>https://jitpack.io</url>
  5. </repository>
  6. </repositories>

step 2.

  1. <dependency>
  2. <groupId>com.github.LuckSiege.PictureSelector</groupId>
  3. <artifactId>picture_library</artifactId>
  4. <version>v1.4.1</version>
  5. </dependency>

项目根目录

  1. allprojects {
  2. repositories {
  3. jcenter()
  4. maven { url 'https://jitpack.io' }
  5. }
  6. }

常见错误*

  1. 问题一:
  2. rxjava冲突:在app build.gradle下添加
  3. packagingOptions {
  4. exclude 'META-INF/rxjava.properties'
  5. }
  6. 问题二:
  7. java.lang.NullPointerException:
  8. Attempt to invoke virtual method 'android.content.res.XmlResourceParser
  9. android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)'
  10. on a null object reference
  11. application下添加如下节点:
  12. <provider
  13. android:name="android.support.v4.content.FileProvider"
  14. android:authorities="${applicationId}.provider"
  15. android:exported="false"
  16. android:grantUriPermissions="true">
  17. <meta-data
  18. android:name="android.support.FILE_PROVIDER_PATHS"
  19. android:resource="@xml/file_paths" />
  20. </provider>
  21. 注意:如已添加其他sdk或项目中已使用过provider节点,
  22. [请参考我的博客](http://blog.csdn.net/luck_mw/article/details/54970105)的解决方案
  23. 问题三:
  24. PhotoView 库冲突,可以删除自己项目中引用的,Picture_library中已经引用过,或引用com.commit451:PhotoView:1.2.4版本

相册启动构造方法

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

启动相册并拍照

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

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

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

预览图片

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

预览视频

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

图片回调完成结果返回

  1. private PictureConfig.OnSelectResultCallback resultCallback = new PictureConfig.OnSelectResultCallback() {
  2. @Override
  3. public void onSelectSuccess(List<LocalMedia> resultList) {
  4. selectMedia = resultList;
  5. Log.i("callBack_result", selectMedia.size() + "");
  6. LocalMedia media = resultList.get(0);
  7. if (media.isCut() && !media.isCompressed()) {
  8. // 裁剪过
  9. String path = media.getCutPath();
  10. } else if (media.isCompressed() || (media.isCut() && media.isCompressed())) {
  11. // 压缩过,或者裁剪同时压缩过,以最终压缩过图片为准
  12. String path = media.getCompressPath();
  13. } else {
  14. // 原图地址
  15. String path = media.getPath();
  16. }
  17. if (selectMedia != null) {
  18. adapter.setList(selectMedia);
  19. adapter.notifyDataSetChanged();
  20. }
  21. }
  22. };

更新日志:

版本 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%

演示效果:

         

 

android多图选择器 图片/视频 单选or多选,以及视频录制。的更多相关文章

  1. 一款多功能的移动端滚动选择器,支持单选到多选、支持多级级联、提供自定义回调函数、提供update函数二次渲染、重定位函数、兼容pc端拖拽等等..

    https://github.com/onlyhom/mobileSelect.js/blob/master/docs/README-CN.md mobileSelect.js 一款多功能的移动端滚动 ...

  2. android -------- 流式布局,支持单选、多选等

    最近开发中有流式标签这个功能,网上学了下,来分享一下 Android 流式布局,支持单选.多选等,适合用于产品标签等. 效果图: 用法: dependencies { compile 'com.hym ...

  3. Android实现选择题答题(包括单选、多选和答题卡)

    在线答题demo,具体代码是一年多前完成的,比较简单,不再贴出,请参见Github. 主要功能: 单选:点击选项直接进入下一题.多选:选择多个选项,向右滑动进入下一题.答题卡:点击题号重新进入答题界面 ...

  4. Android 中图能够用到的图片处理类 BitmapUtils

    Android在实际开发中非常多时候都要对图片进行一定的处理,这里总结的BitmapUtils 类包含一下几个功能: 1.Android图片倒影, 2.Android图片模糊处理, 3.Android ...

  5. [转]Android 超高仿微信图片选择器 图片该这么加载

    快速加载本地图片缩略图的方法: 原文地址:Android 超高仿微信图片选择器 图片该这么加载 其示例代码下载: 仿微信图片选择器 ImageLoader

  6. Android 获取SDCard上图片和视频的缩略图

    获取图片缩略图和视频缩略图的方法: Java代码: import java.io.File; import android.app.Activity; import android.graphics. ...

  7. Android多图选择

    多图选择是Android中一个常用的功能,用户可以拍照或者批量选择图片上传,还是国际惯例,先看下效果图,demo地址我会放到文章末尾. 经过对比,这里我选择了一个第三方开源库PictureSelect ...

  8. Android中直播视频技术探究之---桌面屏幕视频数据源采集功能分析

    一.前言 之前介绍了Android直播视频中一种视频源数据采集:摄像头Camera视频数据采集分析 中介绍了利用Camera的回调机制,获取摄像头的每一帧数据,然后进行二次处理进行推流.现在我们在介绍 ...

  9. Android开发技巧——自定义单选或多选的ListView

    这篇其实应该是属于写自定义单选或多选的ListView的基础教程,无奈目前许多人对此的实现大多都绕了远路,反而使得这正规的写法倒显得有些技巧性了. 本文原创,转载请注明在CSDN上的出处: http: ...

随机推荐

  1. vscode——配置go插件

    前言 这个真的折腾死我了,看了N多博客才弄好 这两个还是比较有用的~ https://www.cnblogs.com/nickchou/p/9038114.html https://www.jians ...

  2. 文件操作-with和上下文管理器

    代码: # -*- coding:utf-8 -*- # 普通版 如果写入的过程中出错 则不会释放资源 def m1(): f = open("test.txt","w& ...

  3. Redis中的缓存雪崩与缓存穿透

    1.缓存雪崩 1.1什么是缓存雪崩? 如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了. 我们都知道Redis不可能把所有的数据都缓存起来(内存昂贵且有限),所以Redis需要对数据设置过期 ...

  4. nginx和php整合安装过程记录

    1.nginx的配置:必须是指定 www用户 和www用户组访问 groupadd www useradd -g www www daokr@DK:~$ cat /etc/nginx/nginx.co ...

  5. leetcode 712

    这道题的思路:我是根据最长公共子序列的思路得来的. 最长公共子序列是: d[i][j]表示字符串s1前i个(0-i-1)字符,和字符串s2前j个(0-j-1)字符的最长公共子序列. 分情况讨论: 当s ...

  6. UOJ46 【清华集训2014】玄学 【时间线段树】

    题目链接:UOJ 这题的时间线段树非常的妙. 对时间建立线段树,修改的时候在后面加,每当填满一个节点之后就合并进它的父亲. 对于一个节点维护序列,发现这是一个分段函数,合并就是归并排序.于是就形成了差 ...

  7. PHP查询oracle数据显示乱码问题

    1.Linux下 执行前脚本前先执行一下命令export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8" 2.Windows下在代码里添加 ...

  8. cs 与 bs 架构

    C/S和B/S各有优势,C/S在图形的表现能力上以及运行的速度上肯定是强于B/S模式的,不过缺点就是他需要运行专门的客户端,而且更重要的是它不能跨平台,用c++在windows下写的程序肯定是不能在l ...

  9. phpMyadmin各个版本漏洞【转载】

    原作者:热爱网络安全的小菜狗 原文链接:phpMyadmin各版本漏洞 0x01 PREGREPLACEEVAL漏洞 影响版本:3.5.x < 3.5.8.1 and 4.0.0 < 4. ...

  10. [内网渗透]lcx端口转发

    0x01 简介 lcx是一款端口转发工具,有三个功能: 第一个功能将本地端口转发到远程主机某个端口上 第二个功能将本地端口转发到本地另一个端口上 第三个功能是进行监听并进行转发使用 Lcx使用的前提是 ...