SkillAgentSearch skills...

PictureSelector

这是一个图片选择器,包括单选,多选,是否开启拍照功能,是否可编辑,是否显示加号,是否允许拖拽排序等功能,还包括九宫格图片显示。新增本地视频,本地gif,音频等文件的选择预览,裁剪ucrop等

Install / Use

/learn @Achenglove/PictureSelector
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

PictureSelector 2.0

一款针对Android平台下的图片选择器,支持从相册获取图片、视频、音频&拍照,支持裁剪(单图or多图裁剪)、压缩、主题自定义配置等功能,支持动态获取权限&适配Android 5.0+系统的开源图片选择框架。<br>   <br>项目一直维护(有bug修复完一般会在周末更新),如果有bug请描述清楚并可以提Issues,个人QQ 893855882 希望用得着的朋友点个star。 <br> Android开发交流 群一 619458861 (已满) <br> Android开发交流 群二 679824206 (已满) <br> Android开发交流 群三 854136996 <br>

 我的博客地址

PRs Welcome CSDN I Star

目录

-注意事项<br> -功能特点<br> -集成方式<br> -常见错误<br> -功能配置<br> -缓存清除<br> -主题配置-Xml方式<br> -主题配置-Code方式<br> -常用功能<br> -结果回调<br> -更新日志<br> -混淆配置<br> -LICENSE<br> -兼容性测试<br> -演示效果<br> -打赏<br>

注意事项 重要!!!

v2.3.3 新增动态配制主题,建议不要与.theme(R.theme.style);方法共用 两者只选其一配制 个人建议使用动态配制为好!!!
.setPictureStyle(mPictureParameterStyle)// 动态自定义相册主题
.setPictureCropStyle(mCropParameterStyle)// 动态自定义裁剪主题
以上两者具体使用方法请参考Demo MainActivity.java实现方式

v2.3.2开始移除了glide,所以使用v2.3.2版本以后的用户一定要配制好图片加载引擎 否则列表图片加载不出来!!!
.loadImageEngine(GlideEngine.createGlideEngine())// 外部传入图片加载引擎,必传项
具体请参考Demo MainActivity.java实现方式

新增api 
.isSingleDirectReturn(false)// 单选模式下是否直接返回,PictureConfig.SINGLE模式下有效
.querySpecifiedFormatSuffix(PictureMimeType.ofPNG())// 查询指定后缀格式资源
.queryMaxFileSize(10)// 只查多少M以内的图片、视频、音频  单位M
.cutOutQuality(90)// 裁剪输出质量 默认100
.compressQuality(80)// 图片压缩后输出质量 0~ 100
.isNotPreviewDownload(true)// 预览图片长按是否可以下载

功能特点

  • 1.适配Android5.0+ &Android Q系统
  • 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压缩档次设置
  • 24.新增圆形头像裁剪
  • 25.新增音频功能查询
  • 26.新增可自定义启动相册动画 forResult(int requestCode, int enterAnim, int exitAnim);
  • 27.新增指定精确查询 querySpecifiedFormatSuffix(PictureMimeType.ofPNG())// 查询指定后缀格式资源
  • 28.新增单选模式可设置点击选择后直接返回控制 isSingleDirectReturn(false)// 单选模式下是否直接返回
  • 29.多图裁剪下可自由选择某图不裁剪不在强制一张张裁剪,但最后一张除外
  • 30.新增动态配制相册主题 .setPictureStyle(mPictureParameterStyle); 请参考Demo
  • 31.新增动态配制裁剪主题 .setPictureCropStyle(mCropParameterStyle); 请参考Demo

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

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

集成方式

方式一 compile引入

dependencies {
    implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.3.4'
}

项目根目录build.gradle加入

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

方式二 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>v2.3.4</version> 
</dependency>

常见错误

 重要:PictureSelector.create();调用此方法时,在activity中传activity.this,在fragment中请传fragment.this,
 影响回调到哪个地方的onActivityResult()。
 
 问题一:
 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
 
 * 注意 从v2.1.3版本中,将不需要配制以下内容
 
 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)的解决方案

问题三:
经测试在小米部分低端机中,Fragment调用PictureSelector 2.0 拍照有时内存不足会暂时回收activity,
导致其fragment会重新创建 建议在fragment所依赖的activity加上如下代码:
if (savedInstanceState == null) {
      // 添加显示第一个fragment
      	fragment = new PhotoFragment();
      		getSupportFragmentManager().beginTransaction().add(R.id.tab_content, fragment,
                    PictureConfig.FC_TAG).show(fragment)
                    .commit();
     } else { 
      	fragment = (PhotoFragment) getSupportFragmentManager()
          .findFragmentByTag(PictureConfig.FC_TAG);
}
这里就是如果是被回收时,则不重新创建 通过tag取出fragment的实例。

问题四:
glide冲突
由于PictureSelector 2.0引入的是最新的glide 4.5.0,所以将项目中老版本的glide删除,并且将报错代码换成如下写法:
RequestOptions options = new RequestOptions();
options.placeholder(R.drawable.image);
Glide.with(context).load(url).apply(options).into(imageView);

问题五:
拍照出现损坏问题
如果出现拍照返回后图片加载不出来出现已损坏现象,建议提前获取一下存储权限,也就是通过RxPermissions.request  
WRITE_EXTERNAL_STORAGE 
READ_EXTERNAL_STORAGE

问题六:
如果出现如下Invoke-customs are only supported starting with Android O (--min-api 26) 错误
请在app目录下的build.gradle android{ }末尾添加    
compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    
 问题七:
 bug:UCropActivity继承AppCompatActivity没有添加Theme会出现一个下面的bug
java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request 
Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
 解决:1.在styles文件中添加去掉ActionBar的theme

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
在Manifest.xml中,修改UCropActivity的theme
<activity
        android:name="com.yalantis.ucrop.UCropActivity"
         android:theme="@style/AppTheme.NoActionBar" />
 
 问题八:
 如果出现图片全部加载不出来的情况时,包括预览、相册列表等,一定要传入
 .loadImageEngine(GlideEngine.createGlideEngine()); //图片加载引擎,必传项,
 也可以自定义成除glide外的其他第三方加载框架,具体请参考Demo

功能配置

// 进入相册 以下是例子:用不到的api可以不写
 PictureSelector.create(MainActivity.this)
 	.openGallery()//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
 	.theme()//主题样式(不设置为默认样式) 也可参考demo values/styles下 例如:R.style.picture.white.style
	.setPictureStyle(mPictureParameterStyle)// 动态自定义相册主题  注意:此方法最好不要与.theme();同时存在, 二选一
        .setPictureCropStyle(mCropParameterStyle)// 动态自定义裁剪主题 注意:此方法最好不要与.theme();同时存在, 二选一
	.loadImageEngine(GlideEngine.createGlideEngine())// 外部传入图片加载引擎,必传项   参考Demo MainActivity中代码
 	.maxSelectNum()// 最大图片选择数量 int
 	.minSelectNum()// 最小选择数量 int
	.imageSpanCount(4)// 每行显示个数 int
	.isNotPreviewDownload(true)// 预览图片长按是否可以下载
	.queryMaxFileSize(10)// 只查多少M以内的图片、视频、音频  单位M
	.querySpecifiedFormatSuffix(PictureMimeType.ofPNG())// 查询指定后缀格式资源
	.cameraFileName("")// 使用相机时保存至本地的文件名称,注意这个只在拍照时可以使用,选图时不要用
	.isSingleDirectReturn(false)// 单选模式下是否直接返回,PictureConfig.SINGLE模式下有效
	.setTitleBarBackgroundColor(titleBarBackgroundColor)//相册标题栏背景色
	.isChangeStatusBarFontColor(isChangeStatusBarFontColor)// 是否关闭白色状态栏字体颜色
        .setStatusBarColorPrimaryDark(statusBarColorPrimaryDark)// 状态栏背景色
        .setUpArrowDrawable(upResId)// 设置标题栏右侧箭头图标
        .setDownArrowDrawable(downResId)// 设置标题栏右侧箭头图标
        .isOpenStyleCheckNumMode(isOpenStyleCheckNumMode)// 是否开启数字选择模式 类似QQ相册
 	.selectionMode()// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
 	.previewImage()// 是否可预览图片 true or false
 	.previewVideo()// 是否可预览视频 true or false
	.enablePreviewAudio() // 是否可播放音频 true or false
 	.isCamera()// 是否显示拍照按钮 true or false
	.imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg
	.isZoomAnim(true)// 图片列表点击 缩放效果 默认true
	.sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
	.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径,可不填
 	.enableCrop()// 是否裁剪 true or false
 	.compress()// 是否压缩 true or false
 	.glideOverride()// int glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度
 	.withAspectRatio()// int 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
 	.hideBottomControls()// 是否显示uCrop工具栏,默认不显示 true or false
 	.isGif()// 是否显示gif图片 true or false
	.compressSavePath(getPath())//压缩图片保存地址
 	.freeStyleCropEnabled()// 裁剪框是否可拖拽 true or false
 	.circleDimmedLayer()// 是否圆形裁剪 true or false
 	.showCropFrame()// 是否显示裁剪矩形边框 圆形裁剪时建议设为false   true or false
 	.showCropGrid()// 是否显示裁剪矩形网格 圆形裁剪时建议设为false    true or false
 	.openClickSound()// 是否开启点击声音 true or false
 	.selectionMedia()// 是否传入已选图片 List<LocalMedia> list
 	.previewEggs()// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false
 	.cropCompressQuality(90)// 废弃 改用cutOutQuality()
        .cutOutQuality(90)// 裁剪输出质量 默认100
 	.minimumCompressSize(100)// 小于100kb的图片不压缩 
 	.synOrAsy(true)//同步true或异步false 压缩 默认同步
 	.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效 int 
 	.rotateEnabled() // 裁剪是否可旋转图片 true or false
 	.scaleEnabled()// 裁剪是否可放大缩小图片 true or false
 	.videoQuality()// 视频录制质量 0 or 1 int
	.videoMaxSecond(15)// 显示多少秒以内的视频or音频也可适用 int 
        .videoMinSecond(10)// 显示多少秒以内的视频or音频也可适用 int 
	.recordVideoSecond()//视频秒数录制 默认60s int
	.isDragFrame(false)// 是否可拖动裁剪框(固定)
 	.forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code     

缓存清除

 //包括裁剪和压缩后的缓存,要在上传成功后调用,type 指的是图片or视频缓存取决于你设置的ofImage或ofVideo 注意:需要系统sd卡权限  
 PictureFileUtils.deleteCacheDirFile(MainActivity.this,type);
 

主题配置

<!--默认样式 注意* 样式只可修改,不能删除任何一项 否则报错-->
    <style name=

Related Skills

View on GitHub
GitHub Stars29
CategoryDevelopment
Updated23d ago
Forks6

Languages

Java

Security Score

90/100

Audited on Mar 6, 2026

No findings