• android多图选择器 图片/视频 单选or多选,以及视频录制。


    PictureSelector

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

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

    github代码地址

     PRs Welcome CSDN I Star

    功能特点:

    1.   1.适配android6.0+系统
    2.   2.解决部分机型裁剪闪退问题
    3.   3.解决图片过大oom闪退问题
    4.   4.动态获取系统权限,避免闪退
    5.   5.支持相片or视频的单选和多选
    6.   6.支持裁剪比例设置,如常用的 1:1343:216: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.  问题二:
    8.  java.lang.NullPointerException: 
    9.  Attempt to invoke virtual method 'android.content.res.XmlResourceParser 
    10.  android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)'
    11.  on a null object reference
    12.  
    13.  application下添加如下节点:
    14.  
    15.  <provider
    16.       android:name="android.support.v4.content.FileProvider"
    17.       android:authorities="${applicationId}.provider"
    18.       android:exported="false"
    19.       android:grantUriPermissions="true">
    20.        <meta-data
    21.          android:name="android.support.FILE_PROVIDER_PATHS"
    22.          android:resource="@xml/file_paths" />
    23. </provider>
    24.  
    25. 注意:如已添加其他sdk或项目中已使用过provider节点,
    26. [请参考我的博客](http://blog.csdn.net/luck_mw/article/details/54970105)的解决方案
    27.  
    28. 问题三:
    29. 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.  或默认配置
    4.  PictureConfig.getInstance().openPhoto(mContext, resultCallback);

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

    1.  PictureConfig.getInstance().init(options).startOpenCamera(mContext, resultCallback);
    2.  
    3.  或默认配置
    4.  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%

    image

    演示效果:

    image image image image image image image image image image

     
  • 相关阅读:
    扩展知识
    day61——多表操作(增、删除、改、基于对象的跨表查询)
    day60——单表操作补充(批量插入、查询、表结构)
    day59——orm单表操作
    day58——模板继承、组件、自定义标签和过滤器、inclusion_tag、静态文件配置、url别名和反向解析、url命名空间
    day57——视图、模板渲染
    WARNING: Ignoring invalid distribution -ip
    Python- 【python无法更新pip】提示python.exe: No module named pip
    Anaconda Prompt 切换路径不能进入D盘
    Failed calling sys.__interactivehook__ 错误的解决
  • 原文地址:https://www.cnblogs.com/yelanggu/p/10835122.html
Copyright © 2020-2023  润新知