组件化升级版 Android 图片选择器 —— PictureSelector v4.1.0 集成与使用指南一、项目背景PictureSelector 是基于开源框架 LuckSiege/PictureSelector (v3.11.2) 进行深度改造的组件化版本。由 GitHub 用户 maxZhou7 维护通过 JitPack 发布当前最新版本为v4.1.0。本项目不仅保留了原版所有的强大功能图片选择、裁剪、压缩、预览等还针对现代 Android 开发进行了关键升级组件化架构拆分CameraX 全面升级到 1.5.0compileSdk 提升至 35Gradle 8.11.1 Kotlin 2.2.10采用 Version Catalog 统一管理依赖二、核心功能特性功能说明图片/视频/音频选择支持从相册选取图片、视频、音频拍照/录像支持自定义相机或系统相机裁剪支持单图/多图裁剪、圆形裁剪压缩支持自定义压缩引擎主题自定义支持全局UI风格配置支持布局重载多种图片加载引擎内置 Glide、Picasso、Coil 示例数据源扩展支持自定义数据源加载权限适配适配 Android 6.0 ~ 13 权限模型沙盒适配适配 Android 10 Scoped StorageAndroidX 全面化全程 AndroidX无 Support 库残留三、组件化架构项目拆分为5 个独立模块可按需引入codePictureSelector/ ├── selector/ ← 核心选择器模块必选 ├── compress/ ← 图片压缩模块可选 ├── ucrop/ ← 图片裁剪模块可选 ├── camerax/ ← 自定义相机模块可选 └── app/ ← 示例 Demo每个模块独立发布到 JitPack通过版本目录Version Catalog统一管理依赖结构清晰、维护便捷。四、快速集成1. 添加 JitPack 仓库在项目级build.gradle或settings.gradle中添加groovydependencyResolutionManagement { repositories { google() mavenCentral() maven { url https://jitpack.io } } }2. 添加依赖Gradle 方式groovydependencies { // 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 方式xmldependency groupIdcom.github.maxZhou7.PictureSelector/groupId artifactIdpictureselector/artifactId versionv4.1.0/version /dependency3. 配置图片加载引擎框架不内置图片加载库需要自行实现ImageEngine接口。项目已提供三种主流引擎示例GlideEnginePicassoEngineCoilEngine4. AndroidManifest 配置xml!-- 基础权限 -- uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE / uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE / uses-permission android:nameandroid.permission.CAMERA / uses-permission android:nameandroid.permission.RECORD_AUDIO / !-- Android 13 细化权限 -- uses-permission android:nameandroid.permission.READ_MEDIA_IMAGES / uses-permission android:nameandroid.permission.READ_MEDIA_VIDEO / uses-permission android:nameandroid.permission.READ_MEDIA_AUDIO / !-- Android 11 相机查询 -- queries package${applicationId} intent action android:nameandroid.media.action.IMAGE_CAPTURE / /intent intent action android:nameandroid.media.action.ACTION_VIDEO_CAPTURE / /intent /queries五、基础用法1. 从相册选择图片javaPictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) .setImageEngine(GlideEngine.createGlideEngine()) .forResult(new OnResultCallbackListenerLocalMedia() { Override public void onResult(ArrayListLocalMedia result) { // 处理选择结果 } Override public void onCancel() { // 用户取消 } });支持的类型ofImage()、ofVideo()、ofAudio()、ofAll()。2. 调用相机拍照javaPictureSelector.create(this) .openCamera(SelectMimeType.ofImage()) .forResult(new OnResultCallbackListenerLocalMedia() { Override public void onResult(ArrayListLocalMedia result) { } Override public void onCancel() { } });3. 预览图片/视频/音频javaPictureSelector.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, ArrayListUri source, OnKeyValueResultCallbackListener call) { // 实现自定义压缩逻辑 } });2. 自定义裁剪引擎java.setCropEngine(new CropFileEngine() { Override public void onStartCrop(Fragment fragment, Uri srcUri, Uri destinationUri, ArrayListString 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 10java.setSandboxFileEngine(new UriToFileTransformEngine() { Override public void onUriToFileAsyncTransform(Context context, String srcPath, String mineType, OnKeyValueResultCallbackListener call) { // 将 Uri 转为可访问的文件路径 } });七、模块间依赖关系值得关注的是selector核心模块的依赖全部使用api而非implementation这意味着消费者在引入selector后无需额外声明appcompat、recyclerview等依赖即可使用相关 API大幅提升了易用性。这是本项目相比原版的一个重要改进。八、自定义 VideoPlayerijkplayer项目还自带了ijkplayer-java 模块用于视频播放预览在 app 模块中通过 project 引用groovyimplementation 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 Cataloglibs.versions.toml统一管理依赖主要依赖如下依赖版本用途Android Gradle Plugin8.11.1构建工具Kotlin2.2.10Kotlin 编译CameraX1.5.0相机框架支持 Recorder APIGlide4.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自动传递compileSdk3435minSdk1423camerax 要求构建工具旧版 GradleGradle 8.11.1 KGP 2.2.10依赖管理手动Version CatalogTOML发布方式本地引用JitPack 远程发布十二、总结maxZhou7/PictureSelector是一个非常成熟的 Android 多媒体选择框架增强版。它的核心优势在于组件化架构— 按需引入包体积可控紧跟最新工具链— Gradle 8.11.1、Kotlin 2.2.10、AGP 8.11.1CameraX 完整升级— 使用最新的 Recorder API 替代废弃的 VideoCapture依赖传递优化— 核心依赖使用 api消费者集成更简单丰富的扩展点— 从压缩、裁剪、相机到权限和数据源均可自定义无论你是需要快速集成图片选择功能还是需要高度定制的多媒体选择方案这个框架都能胜任。GitHub 地址https://github.com/maxZhou7/PictureSelectorJitPack 地址JitPack | Publish JVM and Android libraries最新版本v4.1.0