前言
在做上一个项目时深深受到了图片上传的苦恼。图片上传主要分为两个部分,首先要获取图片,而获取图片可以分为从文件获取或者拍照获取。第二个部分才是上传图片,两个部分都是走了不少弯路。由于Android系统的碎片化比较严重,我们可能出现在第一台机子上能获取图片,但是换一个机子就不能获取图片的问题,并且在Android6.0,7.0之后也要做一定的适配,这样对于开发者来说,无疑很蛋疼。由于也是初学者,很多东西没有考虑到,适配起来也是有点难度的。
这几天也是从github上找到了一个库(地址在这TakePhoto),经过简单的学习之后,发现用起来还是蛮简单的,并且在不同机型之间都能达到同样的效果。更重要的是可以根据不同配置达到不同的效果
接下来看下用法
获取图片
1) 获取TakePhoto对象
一) 通过继承的方式
- 继承TakePhotoActivity、TakePhotoFragmentActivity、TakePhotoFragment三者之一。
- 通过getTakePhoto()获取TakePhoto实例进行相关操作。
- 重写以下方法获取结果
void takeSuccess(TResult result);
void takeFail(TResult result,String msg);
void takeCancel();
这种方法使用起来虽然简单,但是感觉定制性不高,必须继承指定的Activity,而 有时我们已经封装好了BaseActivity,不想再改了。有时候通过继承无法满足实际项目的需求。
二) 通过组装的方式去使用
- 实现TakePhoto.TakeResultListener,InvokeListener接口。
- 在 onCreate,onActivityResult,onSaveInstanceState方法中调用TakePhoto对用的方法。
- 重写onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults),添加如下代码。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//以下代码为处理Android6.0、7.0动态权限所需
TPermissionType type=PermissionManager.onRequestPermissionsResult(requestCode,permissions,grantResults);
PermissionManager.handlePermissionsResult(this,type,invokeParam,this);
}
- 重写TPermissionType invoke(InvokeParam invokeParam)方法,添加如下代码:
@Override
public TPermissionType invoke(InvokeParam invokeParam) {
TPermissionType type=PermissionManager.checkPermission(TContextWrap.of(this),invokeParam.getMethod());
if(TPermissionType.WAIT.equals(type)){
this.invokeParam=invokeParam;
}
return type;
}
- 添加如下代码获取TakePhoto实例:
/**
* 获取TakePhoto实例
* @return
*/
public TakePhoto getTakePhoto(){
if (takePhoto==null){
takePhoto= (TakePhoto) TakePhotoInvocationHandler.of(this).bind(new TakePhotoImpl(this,this));
}
return takePhoto;
}
2)自定义UI
不仅可以对于参数自定义,也可以对于UI的自定义,比如自定义相册,自定义Toolbar, 自定义状态栏,自定义提示文字,自定义裁切工具(需要使用自带的TakePhoto裁剪才行)。
3)通过TakePhoto对象获取图片
支持从相册获取,也支持拍照,相关Api
* 从相机获取图片并裁剪
* @param outPutUri 图片裁剪之后保存的路径
* @param options 裁剪配置
*/
void onPickFromCaptureWithCrop(Uri outPutUri, CropOptions options);
/**
* 从相册中获取图片并裁剪
* @param outPutUri 图片裁剪之后保存的路径
* @param options 裁剪配置
*/
void onPickFromGalleryWithCrop(Uri outPutUri, CropOptions options);
/**
* 从文件中获取图片并裁剪
* @param outPutUri 图片裁剪之后保存的路径
* @param options 裁剪配置
*/
void onPickFromDocumentsWithCrop(Uri outPutUri, CropOptions options);
/**
* 图片多选,并裁切
* @param limit 最多选择图片张数的限制
* @param options 裁剪配置
* */
void onPickMultipleWithCrop(int limit, CropOptions options);
4)裁剪配置
-
CropOptions 用于裁剪的配置类,可以对图片的裁剪比例,最大输出大小,以及是否使用TakePhoto自带的裁剪工具进行裁剪等,进行个性化配置。
-
压缩图片 onEnableCompress(CompressConfig config,boolean showCompressDialog)
-
指定压缩工具 takePhoto里面自带压缩算法,也可以通过第三方的Luban进行压缩
对于TakePhoto的二次封装
封装是对第二种方法的封装,主要参考了第一种的思想封装的。
关于TakePhoto的库代码全部封装到一个TakePhotoUtil工具类中,看代码:
public class TakePhotoUtil implements TakePhoto.TakeResultListener, InvokeListener {
private static final String TAG = TakePhotoUtil.class.getName();
private TakePhoto takePhoto;
private InvokeParam invokeParam;
private Activity activity;
private Fragment fragment;
public TakePhotoUtil(Activity activity){
this.activity = activity;