Android图片选择新标杆:PictureSelector Library全面解析与实战指南
你是否还在为Android应用中的图片选择功能开发而烦恼?从相册获取图片、视频、音频,到拍照、裁剪、压缩,每个环节都可能遇到兼容性问题或复杂的代码实现。PictureSelector Library(图片选择器)作为一款针对Android平台的开源框架,彻底解决了这些痛点,支持Android 5.0+系统,提供一站式图片选择解决方案。本文将带你全面了解PictureSelector的核心功能、集成方法和实战技巧,帮助你快速实现专业级图片选择功能。
项目概述
PictureSelector是一款功能全面的Android图片选择框架,支持从相册获取媒体文件、拍照、裁剪、压缩等多种功能,并提供主题自定义配置。项目结构清晰,模块化设计使得功能扩展和定制极为方便。
核心模块:
- selector:图片选择核心功能模块,负责相册浏览、媒体文件选择等基础功能,源代码位于selector/
- ucrop:图片裁剪模块,基于uCrop实现,支持多种裁剪模式,源代码位于ucrop/
- compress:图片压缩模块,提供高效的图片压缩功能,源代码位于compress/
- camerax:自定义相机模块,基于CameraX实现,支持拍照功能,源代码位于camerax/
项目文档:
- 官方文档:README.md
- 中文文档:README_CN.md
核心功能展示
PictureSelector提供了丰富的功能和灵活的配置选项,满足不同场景下的图片选择需求。以下是几种典型风格的展示:
默认风格
默认风格提供简洁直观的图片选择界面,支持预览和多图裁剪功能。
| 默认风格 | 预览 | 多图裁剪 |
|---|---|---|
![]() | ![]() | ![]() |
数字风格
数字风格以数字标记选中状态,适合需要直观显示选择顺序的场景。
| 数字风格 | 预览 | 多图裁剪 |
|---|---|---|
![]() | ![]() | ![]() |
白色风格
白色风格采用简洁的白色主题,适合现代UI设计,支持单图裁剪功能。
| 白色风格 | 预览 | 单图裁剪 |
|---|---|---|
![]() | ![]() | ![]() |
微信风格
微信风格模仿微信的图片选择界面,提供相册目录浏览、单选模式和头像裁剪功能。
| 相册目录 | 单选模式 | 头像裁剪 |
|---|---|---|
![]() | ![]() | ![]() |
多媒体支持
除了图片选择,PictureSelector还支持视频和音频选择,满足多样化的媒体选择需求。
| 白色风格 | 视频 | 音频 |
|---|---|---|
![]() | ![]() | ![]() |
快速集成指南
环境要求
- Android 5.0+ (API level 21+)
- Gradle 7.0+
集成步骤
- 添加依赖
在项目的build.gradle文件中添加以下依赖:
repositories {
google()
mavenCentral()
}
dependencies {
// PictureSelector 基础 (必须)
implementation 'io.github.lucksiege:pictureselector:v3.11.2'
// 图片压缩 (按需引入)
implementation 'io.github.lucksiege:compress:v3.11.2'
// 图片裁剪 (按需引入)
implementation 'io.github.lucksiege:ucrop:v3.11.2'
// 自定义相机 (按需引入)
implementation 'io.github.lucksiege:camerax:v3.11.2'
}
- 添加权限
在AndroidManifest.xml中添加必要的权限:
<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" />
<!-- Android 13 细化存储权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
对于Android 11及以上版本,使用相机功能需要添加以下查询:
<queries package="${applicationId}">
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
<intent>
<action android:name="android.media.action.ACTION_VIDEO_CAPTURE" />
</intent>
</queries>
基础使用教程
初始化图片引擎
PictureSelector支持多种图片加载引擎,如Glide、Picasso和Coil。以下是使用Glide引擎的示例:
// GlideEngine.java
public class GlideEngine implements ImageEngine {
// 实现图片加载相关方法
// ...
}
图片引擎实现类位于app/src/main/java/com/luck/pictureselector/目录下,包括GlideEngine.java、PicassoEngine.java和CoilEngine.java。
打开相册选择图片
PictureSelector.create(this)
.openGallery(SelectMimeType.ofImage()) // 选择图片类型
.setImageEngine(GlideEngine.createGlideEngine()) // 设置图片引擎
.forResult(new OnResultCallbackListener<LocalMedia>() {
@Override
public void onResult(ArrayList<LocalMedia> result) {
// 处理选择结果
for (LocalMedia media : result) {
// 获取图片路径等信息
String path = media.getPath();
// ...
}
}
@Override
public void onCancel() {
// 取消选择
}
});
单独拍照
PictureSelector.create(this)
.openCamera(SelectMimeType.ofImage()) // 拍照类型
.forResult(new OnResultCallbackListener<LocalMedia>() {
@Override
public void onResult(ArrayList<LocalMedia> result) {
// 处理拍照结果
if (!result.isEmpty()) {
String path = result.get(0).getPath();
// ...
}
}
@Override
public void onCancel() {
// 取消拍照
}
});
预览媒体文件
PictureSelector.create(this)
.openPreview()
.setImageEngine(GlideEngine.createGlideEngine())
.setExternalPreviewEventListener(new OnExternalPreviewEventListener() {
@Override
public void onPreviewDelete(int position) {
// 预览时删除
}
@Override
public boolean onLongPressDownload(LocalMedia media) {
// 长按下载
return false;
}
})
.startActivityPreview(position, true, mediaList); // mediaList为要预览的媒体文件列表
高级功能配置
自定义主题
PictureSelector支持自定义主题样式,通过setSelectorUIStyle()方法配置:
.setSelectorUIStyle(new SelectorUIStyle() {
@Override
public int getTitleBarBackgroundColor(Context context) {
return ContextCompat.getColor(context, R.color.colorPrimary);
}
// 其他样式配置...
})
主题相关资源文件位于selector/src/main/res/values/目录,包括colors.xml、styles.xml等。
图片裁剪
配置图片裁剪功能:
.setCropEngine(new CropFileEngine() {
@Override
public void onStartCrop(Fragment fragment, Uri srcUri, Uri destinationUri, ArrayList<String> dataSource, int requestCode) {
// 自定义裁剪逻辑
UCrop.of(srcUri, destinationUri)
.withAspectRatio(1, 1)
.start(fragment.getActivity(), fragment, requestCode);
}
})
裁剪功能实现位于ucrop/模块,相关布局文件如ucrop_activity_photobox.xml。
图片压缩
配置图片压缩功能:
.setCompressEngine(new CompressFileEngine() {
@Override
public void onStartCompress(Context context, ArrayList<Uri> source, OnKeyValueResultCallbackListener call) {
// 自定义压缩逻辑
new CompressImage(context)
.load(source)
.compress(new OnCompressListener() {
@Override
public void onSuccess(ArrayList<String> paths) {
call.onCallback(paths);
}
// 其他回调...
});
}
})
压缩功能实现位于compress/模块,源代码位于compress/src/main/java/top/zibin/目录。
自定义布局
通过重载布局实现自定义界面:
.setInjectLayoutResourceListener(new OnInjectLayoutResourceListener() {
@Override
public int getLayoutResourceId(Context context, int resourceSource) {
if (resourceSource == InjectResourceType.TYPE_TITLE_BAR) {
return R.layout.custom_title_bar; // 自定义标题栏布局
}
return 0;
}
})
布局文件位于app/src/main/res/layout/目录,如activity_main.xml、ps_custom_title_bar.xml等。
混淆配置
为避免混淆导致功能异常,需要在proguard-rules.pro中添加以下配置:
-keep class com.luck.picture.lib.** { *; }
# 如果引入了Camerax库
-keep class com.luck.lib.camerax.** { *; }
# 如果引入了Ucrop库
-dontwarn com.yalantis.ucrop**
-keep class com.yalantis.ucrop** { *; }
-keep interface com.yalantis.ucrop** { *; }
混淆配置文件位于app/proguard-rules.pro。
兼容性与测试
PictureSelector经过全面的兼容性测试,支持多种Android设备和系统版本。测试报告显示通过率达到100%:
总结
PictureSelector Library作为一款功能全面、易于集成的Android图片选择框架,为开发者提供了一站式的媒体选择解决方案。从基础的图片选择、拍照,到高级的裁剪、压缩功能,再到灵活的主题自定义和布局重载,PictureSelector都能满足各种场景需求。通过本文的介绍,相信你已经对PictureSelector有了全面的了解,可以开始在项目中集成使用了。
项目地址:https://gitcode.com/gh_mirrors/pict/PictureSelector
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



















