Android 图片选择器——PictureSelector升级
2026/6/18 22:14:40 网站建设 项目流程

组件化升级版 Android 图片选择器 —— PictureSelector v4.1.0 集成与使用指南

一、项目背景

PictureSelector 是基于开源框架 LuckSiege/PictureSelector (v3.11.2) 进行深度改造的组件化版本。由 GitHub 用户 maxZhou7 维护,通过 JitPack 发布,当前最新版本为v4.1.0

本项目不仅保留了原版所有的强大功能(图片选择、裁剪、压缩、预览等),还针对现代 Android 开发进行了关键升级:

  • 组件化架构拆分
  • CameraX 全面升级到 1.5.0
  • compileSdk 提升至 35
  • Gradle 8.11.1 + Kotlin 2.2.10
  • 采用 Version Catalog 统一管理依赖

二、核心功能特性

功能说明
图片/视频/音频选择支持从相册选取图片、视频、音频
拍照/录像支持自定义相机或系统相机
裁剪支持单图/多图裁剪、圆形裁剪
压缩支持自定义压缩引擎
主题自定义支持全局UI风格配置,支持布局重载
多种图片加载引擎内置 Glide、Picasso、Coil 示例
数据源扩展支持自定义数据源加载
权限适配适配 Android 6.0 ~ 13+ 权限模型
沙盒适配适配 Android 10+ Scoped Storage
AndroidX 全面化全程 AndroidX,无 Support 库残留

三、组件化架构

项目拆分为5 个独立模块,可按需引入:

code

PictureSelector/ ├── selector/ ← 核心选择器模块(必选) ├── compress/ ← 图片压缩模块(可选) ├── ucrop/ ← 图片裁剪模块(可选) ├── camerax/ ← 自定义相机模块(可选) └── app/ ← 示例 Demo

每个模块独立发布到 JitPack,通过版本目录(Version Catalog)统一管理依赖,结构清晰、维护便捷。

四、快速集成

1. 添加 JitPack 仓库

在项目级build.gradlesettings.gradle中添加:

groovy

dependencyResolutionManagement { repositories { google() mavenCentral() maven { url 'https://jitpack.io' } } }
2. 添加依赖

Gradle 方式:

groovy

dependencies { // PictureSelector 基础模块 (必须) implementation 'com.github.maxZhou7.PictureSelector:pictureselector:v4.1.0' // 以下按需引入 implementation 'com.github.maxZhou7.PictureSelector:compress:v4.1.0' // 压缩 implementation 'com.github.maxZhou7.PictureSelector:ucrop:v4.1.0' // 裁剪 implementation 'com.github.maxZhou7.PictureSelector:camerax:v4.1.0' // 相机 }

Maven 方式:

xml

<dependency> <groupId>com.github.maxZhou7.PictureSelector</groupId> <artifactId>pictureselector</artifactId> <version>v4.1.0</version> </dependency>
3. 配置图片加载引擎

框架不内置图片加载库,需要自行实现ImageEngine接口。项目已提供三种主流引擎示例:

  • GlideEngine
  • PicassoEngine
  • CoilEngine
4. 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" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 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>

五、基础用法

1. 从相册选择图片

java

PictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) .setImageEngine(GlideEngine.createGlideEngine()) .forResult(new OnResultCallbackListener<LocalMedia>() { @Override public void onResult(ArrayList<LocalMedia> result) { // 处理选择结果 } @Override public void onCancel() { // 用户取消 } });

支持的类型:ofImage()ofVideo()ofAudio()ofAll()

2. 调用相机拍照

java

PictureSelector.create(this) .openCamera(SelectMimeType.ofImage()) .forResult(new OnResultCallbackListener<LocalMedia>() { @Override public void onResult(ArrayList<LocalMedia> result) { } @Override public void onCancel() { } });
3. 预览图片/视频/音频

java

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, "data");

六、进阶功能

1. 自定义压缩引擎

java

.setCompressEngine(new CompressFileEngine() { @Override public void onStartCompress(Context context, ArrayList<Uri> source, OnKeyValueResultCallbackListener call) { // 实现自定义压缩逻辑 } });
2. 自定义裁剪引擎

java

.setCropEngine(new CropFileEngine() { @Override public void onStartCrop(Fragment fragment, Uri srcUri, Uri destinationUri, ArrayList<String> dataSource, int requestCode) { // 实现自定义裁剪逻辑 } });
3. 自定义相机拦截

java

.setCameraInterceptListener(new OnCameraInterceptListener() { @Override public void openCamera(Fragment fragment, int cameraMode, int requestCode) { // 跳转自定义相机界面 } });
4. 设置主题风格

java

.setSelectorUIStyle(); // 使用预设主题 // 或重载布局 .setInjectLayoutResourceListener(new OnInjectLayoutResourceListener() { @Override public int getLayoutResourceId(Context context, int resourceSource) { return R.layout.custom_layout; // 返回自定义布局ID } });
5. 自定义权限申请

java

.setPermissionsInterceptListener(new OnPermissionsInterceptListener() { @Override public void requestPermission(Fragment fragment, String[] permissionArray, OnRequestPermissionListener call) { // 使用第三方权限库 } @Override public boolean hasPermissions(Fragment fragment, String[] permissionArray) { return false; } });
6. 沙盒文件处理(Android 10+)

java

.setSandboxFileEngine(new UriToFileTransformEngine() { @Override public void onUriToFileAsyncTransform(Context context, String srcPath, String mineType, OnKeyValueResultCallbackListener call) { // 将 Uri 转为可访问的文件路径 } });

七、模块间依赖关系

值得关注的是,selector核心模块的依赖全部使用api而非implementation,这意味着消费者在引入selector后无需额外声明appcompatrecyclerview等依赖即可使用相关 API,大幅提升了易用性。这是本项目相比原版的一个重要改进。

八、自定义 VideoPlayer(ijkplayer)

项目还自带了ijkplayer-java 模块用于视频播放预览,在 app 模块中通过 project 引用:

groovy

implementation project(":ijkplayer-java")

如果不需要视频播放功能,可以移除该依赖。

九、ProGuard 混淆配置

proguard

# PictureSelector -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** { *; }

十、依赖版本一览

项目采用 Gradle Version Catalog(libs.versions.toml)统一管理依赖,主要依赖如下:

依赖版本用途
Android Gradle Plugin8.11.1构建工具
Kotlin2.2.10Kotlin 编译
CameraX1.5.0相机框架(支持 Recorder API)
Glide4.15.1图片加载引擎
Coil2.1.0Kotlin 协程图片加载
ExoPlayer2.18.0视频播放
OkHttp3.12.12网络请求(ucrop 模块使用)
Gson2.8.6JSON 解析(ucrop 模块使用)

十一、与原版的差异总结

对比项LuckSiege/PictureSelector v3.11.2maxZhou7/PictureSelector v4.1.0
架构单模块组件化(5 模块)
CameraX旧版 VideoCapture1.5.0 + Recorder 新 API
依赖传递implementationapi(自动传递)
compileSdk3435
minSdk1423(camerax 要求)
构建工具旧版 GradleGradle 8.11.1 + KGP 2.2.10
依赖管理手动Version Catalog(TOML)
发布方式本地引用JitPack 远程发布

十二、总结

maxZhou7/PictureSelector是一个非常成熟的 Android 多媒体选择框架增强版。它的核心优势在于:

  1. 组件化架构— 按需引入,包体积可控
  2. 紧跟最新工具链— Gradle 8.11.1、Kotlin 2.2.10、AGP 8.11.1
  3. CameraX 完整升级— 使用最新的 Recorder API 替代废弃的 VideoCapture
  4. 依赖传递优化— 核心依赖使用 api,消费者集成更简单
  5. 丰富的扩展点— 从压缩、裁剪、相机到权限和数据源均可自定义

无论你是需要快速集成图片选择功能,还是需要高度定制的多媒体选择方案,这个框架都能胜任。


GitHub 地址:https://github.com/maxZhou7/PictureSelectorJitPack 地址:JitPack | Publish JVM and Android libraries最新版本:v4.1.0

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询