# MXImagePicker
**Repository Path**: zhangmengxiong/MXImagePicker
## Basic Information
- **Project Name**: MXImagePicker
- **Description**: 🔥基于Kotlin,AndroidX的仿微信图片选择器
- **Primary Language**: Android
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 112
- **Forks**: 39
- **Created**: 2021-03-17
- **Last Updated**: 2025-06-13
## Categories & Tags
**Categories**: android-modules
**Tags**: None
## README
# ImagePicker
## 介绍
基于Kotlin,AndroidX的仿微信图片选择器
[](https://jitpack.io/#com.gitee.zhangmengxiong/MXImagePicker)
---
Gradle引用
```gradle
implementation 'com.gitee.zhangmengxiong:MXImagePicker:1.6.9'
```



## 使用方法
#### 第一步:项目增加Androidx库和Glide图片加载库、图片缩放库
```gradle
implementation "androidx.appcompat:appcompat:x.x.x"
implementation "androidx.recyclerview:recyclerview:x.x.x"
implementation "com.github.bumptech.glide:glide:x.x.x"
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
implementation "com.github.chrisbanes:PhotoView:2.3.0"
```
#### 第二步:使用前需要修改‘AndroidManifest.xml’配置:添加相册、存储权限
```kotlin
// 如果 Android版本 < 33 需要以下权限:
Manifest.permission.CAMERA
Manifest.permission.READ_EXTERNAL_STORAGE
// 如果 Android版本 >= 33 需要以下权限:
Manifest.permission.CAMERA
Manifest.permission.READ_MEDIA_IMAGES
Manifest.permission.READ_MEDIA_VIDEO
// targetSdkVersion >= 29 的应用需要在application节点添加以下属性
android:requestLegacyExternalStorage = "true"
```
注意:`没有权限进入选择页面会报错!`
#### 第三步:启动选择页面
```kotlin
val intent = MXPickerBuilder().setMaxSize(3).createIntent(this)
startActivityForResult(intent, 0x22)
```
##### 预加载说明
预加载可以提前搜索本机图片/视频资源,减少首次进入选择页面时空白时间
```kotlin
MXImagePicker.init(application)
lifecycleScope.launch{ MXImagePicker.preScan(this@MainActivity) }
```
##### MXPickerBuilder参数说明
1. `setMaxSize(size: Int)` 设置最大选择文件个数
2. `setType(type: PickerType)` 设置类型
* PickerType.Image = 图片
* PickerType.Video = 视频
* PickerType.ImageAndVideo = 图片 + 视频 混合选择
3. `setCameraEnable(enable: Boolean)` 设置是否启动拍摄功能,默认=true
4. `setMaxVideoLength(length: Int)` 当类型=Video时,可以选择视频最大时长限制,单位:秒 默认=-1 无限制
5. `setMaxListSize(size: Int)` 最长列表加载长度,防止图片过多时产生OOM -1=不限制 默认限制长度=1000条
```kotlin
// 在图片选择器Activity创建时会回调这个方法,一般会通过这个来改变导航栏、状态栏的Theme,demo中搭配`ImmersionBar`来实现沉浸式效果
MXImagePicker.registerActivityCallback { activity ->
ImmersionBar.with(activity)
.autoDarkModeEnable(true)
.statusBarColorInt(activity.resources.getColor(R.color.picker_color_background))
.fitsSystemWindows(true)
.navigationBarColor(R.color.picker_color_background)
.init()
}
```
##### 页面颜色设置
将下面颜色值放如主项目的资源xml中,可以修改页面对应的颜色显示
```xml
#333333
#F1F1F1
#03CE65
```
##### 多语言设置
将下面字符串定义放入对应的语言目录中,可以修改页面对应的文字提示
```xml
选择
全部
您最多只能选择 %s 张图片!
您最多只能选择 %s 个视频!
只能选择 %s 秒以内的视频
需要写入存储、相机权限
需要读取存储权限
打开失败!
预览
原图
拍摄图片
拍摄视频
图片查看
```
dimens.xml 资源
```xml
50dp
```
##### 自定义图片加载器(默认使用Glide)
通过继承实现接口`IImageLoader` ,并注册到服务`MXImagePicker`即可
```kotlin
// 数据对象
data class MXItem(val path: String, val time: Long, val type: MXPickerType, val duration: Int = 0)
// 全局注册加载器,可以卸载Application里面,不影响启动速度
MXImagePicker.registerImageLoader { activity, item, imageView ->
if (File(item.path).exists()) {
Glide.with(activity).load(File(item.path))
.placeholder(R.drawable.mx_icon_picker_image_place_holder).into(imageView)
} else if (item.path.startsWith("http")) {
Glide.with(activity).load(item.path)
.placeholder(R.drawable.mx_icon_picker_image_place_holder).into(imageView)
} else {
Glide.with(activity).load(item.uri)
.placeholder(R.drawable.mx_icon_picker_image_place_holder).into(imageView)
}
}
```
#### 第四步:获取返回结果
```kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK && requestCode == 0x22) {
val paths = MXPickerBuilder.getPickerResult(data) ?: return //返回List类型数据
println(paths)
}
}
```
### 调取摄像头单独拍摄照片
```kotlin
val builder = MXCaptureBuilder().setType(MXPickerType.Image)
startActivityForResult(builder.createIntent(this), 0x11)
// 在onActivityResult获取结果
val file = builder.getCaptureFile()
```
### 调取摄像头单独拍摄视频
```kotlin
val builder = MXCaptureBuilder().setType(MXPickerType.Video).setMaxVideoLength(10)
startActivityForResult(builder.createIntent(this), 0x11)
// 在onActivityResult获取结果
val file = builder.getCaptureFile()
```
### 图片查看器

```kotlin
MXImgShowActivity.open(
this, arrayListOf(
"http://videos.jzvd.org/v/饺子主动.jpg",
"http://videos.jzvd.org/v/饺子运动.jpg"
), "图片详情"
)
```
### 单张图片压缩
```kotlin
val file = File(".../xx.png")
val scaleImg = MXImageCompress.from(context)
.setCacheDir(applicationContext.cacheDir) // 缓存目录
.setSupportAlpha(true) // 支持透明通道(’.png‘格式) 默认=’.jpg‘格式
.setTargetFileSize(50) // 设置压缩文件大小目标值 单位:Kb 默认=0 自然压缩
.setTargetPixel(2400) // 设置压缩文件宽或高目标值 单位:像素
.compress(file)
```