PhotoSelector
Posted Wei_Leng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PhotoSelector相关的知识,希望对你有一定的参考价值。
项目地址:mehayou/PhotoSelector
简介: 调用系统相机相册,拍摄照片、选取图片,进行裁剪、压缩处理图片。
标签:
介绍
调用系统相机相册,拍摄照片、选取图片,进行裁剪、压缩处理图片。
- 简单、实用、方便
- 适配已知系统版本问题(API16~30)
- 无需手动申请动态权限
- 校正拍照后图片角度被旋转
- 异步处理图片压缩、结果回调
- 系统相册媒体库显示刷新(拍照、裁剪、压缩后的图片)
- 多种回调结果类型可选(Flie、byte[]、Bitmap、Drawable、String)
依赖
参照最终版本名称替换下面的“releases”
Gradle
implementation 'com.mehayou:photoselector:releases'
Maven
<dependency>
<groupId>com.mehayou</groupId>
<artifactId>photoselector</artifactId>
<version>releases</version>
<type>pom</type>
</dependency>
权限申请
- 在 androidManifest.xml 中添加申明读写权限,如下:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- Android10(即 API29)及以上时,需要申明访问公共外部存储权限,在 AndroidManifest.xml 中,application 节点下添加:
android:requestLegacyExternalStorage="true"
使用说明
更改默认参数进行实例化(以下配置都是默认参数):
PhotoSelector selector = new PhotoSelector.Builder(this)
.setRequestCode(81, 82, 80) // 结果回调、权限申请回调共用的请求码,互不相等才有效
.setPermissionCallback(null) // 权限回调,用户选择不再询问被拒,弹窗提示
.setRecycle(true, true, true) // 是否回收拍照、裁剪、压缩图片(返回结果类型为 File 时,最终生成的图片不会自动被回收)
.setCompress(false) // 是否开启压缩功能
.setCompressCallback(null) // 压缩回调监听
.setCompressImageSize(1080) // 压缩图片分辨率大小,为 0 则不压缩,单位 px
.setCompressFileSize(200 << 10) // 压缩文件大小,为 0 则不压缩,单位 byte
.setCompressFormat(Bitmap.CompressFormat.JPEG) // 压缩输出格式,PNG 不支持压缩文件大小
.setCrop(false) // 是否开启裁剪功能
.setCropAspect(1, 1) // 裁剪比例,小于 1 则默认为 1
.setCropOutput(0, 0) // 强制裁剪图片分辨率大小,为 0 则不裁剪,注:使用后 setCropAspect、setCompressImageSize 方法失效
.setFileNameFormat("yyyymmddhhmmssSSS") // 输出文件名称格式,若格式不正确或为空,则默认取时间戳
.setDirectory(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)) // 输出目录
.create(this); // 创建选择器,并回调结果。默认回调结果类型为 File,可用 ResultFactory 选择其他类型
注:建议分辨率大一些,文件小一些,图片更清晰
重写 Activity/Fragment 回调方法
结果回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
selector.onActivityResult(requestCode, resultCode, data);
权限申请回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
selector.onRequestPermissionsResult(requestCode, permissions, grantResults);
调用相机相册
调用时,方法会自动申请读写权限
// 去拍照
selector.toCamera();
// 去相册
selector.toGallery();
方法以及回调
方法
// 去拍照
selector.toCamera();
// 去相册
selector.toGallery();
// 回收拍照、裁剪、压缩后的图片文件(不涉及相册原文件)
selector.recycle();
// 是否正在压缩图片
selector.isCompressing();
// 处理结果回调
selector.onActivityResult(requestCode, resultCode, data);
// 处理权限回调
selector.onRequestPermissionsResult(requestCode, permissions, grantResults);
结果回调
结果回调支持 Flie、byte[]、Bitmap、Drawable、String
new PhotoSelector.ResultCallback<File>()
/**
* 结果回调
* @param file 图片文件
*/
@Override
public void onImageResult(File file)
imageView.setImageURI(Uri.fromFile(file));
;
压缩回调
new PhotoSelector.CompressCallback()
/**
* 压缩开始
*/
@Override
public void onCompressStart()
//loading start
/**
* 压缩完成
* @param compress 是否进行了压缩(存在直出,没有进行压缩)
*/
@Override
public void onCompressComplete(boolean compress)
//loading complete
;
权限回调
new PhotoSelector.PermissionCallback()
/**
* 授权失败
* @param permissions 授权被拒且不再询问的权限
*/
@Override
public void onPermissionRationale(List<String> permissions)
// TODO 弹窗提示
;
版本说明
v1.0.3
小修复,小调整。
- 修复路径更改后时,去相机拍照报错;修正默认文件名时间错误
- 移除相机权限申请
- 调整结果回调方式
以上是关于PhotoSelector的主要内容,如果未能解决你的问题,请参考以下文章