一款针对Android平台下的图片选择器,支持从相册获取图片、视频、音频&拍照,支持裁剪(单图or多图裁剪)、压缩、主题自定义配置等功能,支持动态获取权限&适配Android 5.0+系统的开源图片选择框架。
首先是在build.gradle
里面添加
implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.8'
在项目的build.gradle
里面buildscript、repositories和allprojects、repositories添加
maven { url 'https://jitpack.io' }
添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.CAMERA"/>
6.0以上需要动态申请权限调用方法
//先定义
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.CAMER"};
//然后通过一个函数来申请
public static void verifyStoragePermissions(Activity activity) {
try {
//检测是否有写的权限
int permission = ActivityCompat.checkSelfPermission(activity,
"android.permission.WRITE_EXTERNAL_STORAGE");
if (permission != PackageManager.PERMISSION_GRANTED) {
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
}
} catch (Exception e) {
e.printStackTrace();
}
}
PictureSelector.create(this)
.openGallery(PictureConfig.TYPE_IMAGE)
.imageSpanCount(4)// 每行显示个数 int
.maxSelectNum(1)
.selectionMode(PictureConfig.SINGLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
.isSingleDirectReturn(true)//PictureConfig.SINGLE模式下是否直接返回
.previewImage(true)// 是否可预览图片 true or false
.isCamera(true)// 是否显示拍照按钮 true or false
.imageFormat(PictureMimeType.JPEG)// 拍照保存图片格式后缀,默认jpeg
.isZoomAnim(true)// 图片列表点击 缩放效果 默认true
.setOutputCameraPath(Const.getImgPath())// 自定义拍照保存路径,可不填
.enableCrop(true)// 是否裁剪 true or false
.compress(true)// 是否压缩 true or false
.compressSavePath(Const.getImgPath())//压缩图片保存地址
.freeStyleCropEnabled(true)// 裁剪框是否可拖拽 true or false
.showCropGrid(true)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false true or false
.forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
接收回调
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == -1 && data != null) {
switch (requestCode) {
case PictureConfig.CHOOSE_REQUEST:
List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data);
imageView.setImageURI(Uri.parse(selectList.get(0).getCompressPath()));
break;
}
}
}
Const.java是拍照图片的保存路径地址
import android.os.Environment;
import android.util.Log;
import java.io.File;
public class Const {
public static String IMG_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "onlineStoreImg";
public static String getImgPath() {
File file = new File(IMG_PATH);
if (!file.exists()) {
boolean mkdirs = file.mkdirs();
if (!mkdirs) {
Log.e("TAG", "文件夹创建失败");
return Environment.DIRECTORY_PICTURES+"/"+"onlineStoreImg";
} else {
Log.e("TAG", "文件夹创建成功");
}
}else {
}
return IMG_PATH;
}
}
PictureSelector.create(this)
.openGallery()//相册 媒体类型 PictureMimeType.ofAll()、ofImage()、ofVideo()、ofAudio()
//.openCamera()//单独使用相机 媒体类型 PictureMimeType.ofImage()、ofVideo()
.theme()// xml样式配制 R.style.picture_default_style、picture_WeChat_style or 更多参考Demo
.loadImageEngine()// 图片加载引擎 需要 implements ImageEngine接口
.selectionMode()//单选or多选 PictureConfig.SINGLE PictureConfig.MULTIPLE
.isPageStrategy()//开启分页模式,默认开启另提供两个参数;pageSize每页总数;isFilterInvalidFile是否过滤损坏图片
.isSingleDirectReturn()//PictureConfig.SINGLE模式下是否直接返回
.isWeChatStyle()//开启R.style.picture_WeChat_style样式
.setPictureStyle()//动态自定义相册主题
.setPictureCropStyle()//动态自定义裁剪主题
.setPictureWindowAnimationStyle()//相册启动退出动画
.isCamera()//列表是否显示拍照按钮
.isZoomAnim()//图片选择缩放效果
.imageFormat()//拍照图片格式后缀,默认jpeg, PictureMimeType.PNG,Android Q使用PictureMimeType.PNG_Q
.maxSelectNum()//最大选择数量,默认9张
.minSelectNum()// 最小选择数量
.maxVideoSelectNum()//视频最大选择数量
.minVideoSelectNum()//视频最小选择数量
.videoMaxSecond()// 查询多少秒以内的视频
.videoMinSecond()// 查询多少秒以内的视频
.imageSpanCount()//列表每行显示个数
.openClickSound()//是否开启点击声音
.selectionMedia()//是否传入已选图片
.recordVideoSecond()//录制视频秒数 默认60s
.previewEggs()//预览图片时是否增强左右滑动图片体验
.cropCompressQuality()// 注:已废弃 改用cutOutQuality()
.isGif()//是否显示gif
.previewImage()//是否预览图片
.previewVideo()//是否预览视频
.enablePreviewAudio()//是否预览音频
.enableCrop()//是否开启裁剪
.cropWH()// 裁剪宽高比,已废弃,改用. cropImageWideHigh()方法
.cropImageWideHigh()// 裁剪宽高比,设置如果大于图片本身宽高则无效
.withAspectRatio()//裁剪比例
.cutOutQuality()// 裁剪输出质量 默认100
.freeStyleCropEnabled()//裁剪框是否可拖拽
.circleDimmedLayer()// 是否开启圆形裁剪
.setCircleDimmedColor()//设置圆形裁剪背景色值
.setCircleDimmedBorderColor()//设置圆形裁剪边框色值
.setCircleStrokeWidth()//设置圆形裁剪边框粗细
.showCropFrame()// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
.showCropGrid()//是否显示裁剪矩形网格 圆形裁剪时建议设为false
.rotateEnabled()//裁剪是否可旋转图片
.scaleEnabled()//裁剪是否可放大缩小图片
.isDragFrame()//是否可拖动裁剪框(固定)
.hideBottomControls()//显示底部uCrop工具栏
.basicUCropConfig()//对外提供ucrop所有的配制项
.compress()//是否压缩
.compressFocusAlpha()//压缩后是否保持图片的透明通道
.minimumCompressSize()// 小于多少kb的图片不压缩
.videoQuality()//视频录制质量 0 or 1
.compressQuality()//图片压缩后输出质量
.synOrAsy()//开启同步or异步压缩
.queryMaxFileSize()//查询指定大小内的图片、视频、音频大小,单位M
.compressSavePath()//自定义压缩图片保存地址,注意Q版本下的适配
.sizeMultiplier()//glide加载大小,已废弃
.glideOverride()//glide加载宽高,已废弃
.isMultipleSkipCrop()//多图裁剪是否支持跳过
.isMultipleRecyclerAnimation()// 多图裁剪底部列表显示动画效果
.querySpecifiedFormatSuffix()//只查询指定后缀的资源,PictureMimeType.ofJPEG() ...
.isReturnEmpty()//未选择数据时按确定是否可以退出
.isAndroidQTransform()//Android Q版本下是否需要拷贝文件至应用沙盒内
.setRequestedOrientation()//屏幕旋转方向 ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED ...
.isOriginalImageControl()//开启原图选项
.bindCustomPlayVideoCallback()//自定义视频播放拦截
.bindCustomCameraInterfaceListener()//自定义拍照回调接口
.cameraFileName()//自定义拍照文件名,如果是相册内拍照则内部会自动拼上当前时间戳防止重复
.renameCompressFile()//自定义压缩文件名,多张压缩情况下内部会自动拼上当前时间戳防止重复
.renameCropFileName()//自定义裁剪文件名,多张裁剪情况下内部会自动拼上当前时间戳防止重复
.setRecyclerAnimationMode()//列表动画效果,AnimationType.ALPHA_IN_ANIMATION、SLIDE_IN_BOTTOM_ANIMATION
.isUseCustomCamera()// 开启自定义相机
.setButtonFeatures()// 自定义相机按钮状态,CustomCameraView.BUTTON_STATE_BOTH
.setLanguage()//国际化语言 LanguageConfig.CHINESE、ENGLISH、JAPAN等
.isWithVideoImage()//图片和视频是否可以同选,只在ofAll模式下有效
.isMaxSelectEnabledMask()//选择条件达到阀时列表是否启用蒙层效果
.isAutomaticTitleRecyclerTop()//图片列表超过一屏连续点击顶部标题栏快速回滚至顶部
.loadCacheResourcesCallback()//获取ImageEngine缓存图片,参考Demo
.setOutputCameraPath()// 自定义相机输出目录只针对Android Q以下版本,具体参考Demo
.forResult();//结果回调分两种方式onActivityResult()和OnResultCallbackListener方式