PictureSelector
这是一个图片选择器,包括单选,多选,是否开启拍照功能,是否可编辑,是否显示加号,是否允许拖拽排序等功能,还包括九宫格图片显示。新增本地视频,本地gif,音频等文件的选择预览,裁剪ucrop等
Install / Use
/learn @Achenglove/PictureSelectorREADME
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>
目录
-注意事项<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
node-connect
340.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
340.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.1kCommit, push, and open a PR
