retrofit 上传图片或文件,第三方库pictureselector
1.导包
api 'io.github.lucksiege:pictureselector:v2.7.3-rc05'
2.代码
private void updateImage() {
Acp.getInstance(getActivity()).request(new AcpOptions.Builder()
.setPermissions(CAMERA, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE)
.build(), new AcpListener() {
@Override
public void onGranted() {
PictureSelector.create(getActivity())
.openGallery(PictureMimeType.ofImage())
.imageEngine(GlideEngine.createGlideEngine())// 外部传入图片加载引擎,必传项;不然相册呈现白色背景,不显示图片
.maxSelectNum(1)
.selectionMode(PictureConfig.SINGLE)//PictureConfig.MULTIPLE : PictureConfig.SINGLE // 多选 or 单选
.isEnableCrop(true)// 是否裁剪
.isCompress(true)// 是否压缩
.freeStyleCropEnabled(true)// 裁剪框是否可拖拽
.freeStyleCropMode(OverlayView.DEFAULT_CROP_GRID_COLUMN_COUNT)// 裁剪框拖动模式
.circleDimmedLayer(true)// 是否圆形裁剪
.isAndroidQTransform(true)// 是否需要处理Android Q 拷贝至应用沙盒的操作,只针对compress(false); && .isEnableCrop(false);有效,默认处理
.isOriginalImageControl(false)// 是否显示原图控制按钮,如果设置为true则用户可以自由选择是否使用原图,压缩、裁剪功能将会失效
.forResult(new OnResultCallbackListener<LocalMedia>() {
@Override
public void onResult(List<LocalMedia> result) {
// onResult Callback
LogUtils.d(TAG, "图片个数===>" + result.size() + "");
for (int i = 0; i < result.size(); i++) {
String imgPath = result.get(i).getCompressPath() + "";
String filename = result.get(i).getFileName() + "";
// LogUtils.d(TAG, "图片路径===>" + imgPath);
// LogUtils.d(TAG, "图片名称===>" + filename);
LogUtils.d(TAG, "文件名: " + result.get(i).getFileName());
LogUtils.d(TAG, "是否压缩:" + result.get(i).isCompressed());
LogUtils.d(TAG, "压缩:" + result.get(i).getCompressPath());
LogUtils.d(TAG, "原图:" + result.get(i).getPath());
LogUtils.d(TAG, "绝对路径:" + result.get(i).getRealPath());
LogUtils.d(TAG, "是否裁剪:" + result.get(i).isCut());
LogUtils.d(TAG, "裁剪:" + result.get(i).getCutPath());
LogUtils.d(TAG, "是否开启原图:" + result.get(i).isOriginal());
LogUtils.d(TAG, "原图路径:" + result.get(i).getOriginalPath());
LogUtils.d(TAG, "Android Q 特有Path:" + result.get(i).getAndroidQToPath());
LogUtils.d(TAG, "宽高: " + result.get(i).getWidth() + "x" + result.get(i).getHeight());
LogUtils.d(TAG, "Size: " + result.get(i).getSize());
File file = new File(imgPath);
//参数添加
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM);
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);//文件形式
// RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file);//只限图片
// MultipartBody.Part part = MultipartBody.Part.createFormData("avatarfile", file.getName(), requestFile);
builder.addFormDataPart("avatarfile", file.getName(), requestFile);
MultipartBody.Part part = builder.build().part(0);
updateAvatar(part);
}
}
@Override
public void onCancel() {
// onCancel Callback
}
});
}
@Override
public void onDenied(List<String> permissions) {
ToastUtils.showShort("此功能需要授权");
}
});
}
private void updateAvatar(MultipartBody.Part part) {
mineViewModel.updateAvatar(part).observe(getActivity(), new Observer<UpdateAvatarBean>() {
@Override
public void onChanged(UpdateAvatarBean updateAvatarBean) {
if (updateAvatarBean.getCode() == 200) {
// hideLoading();
ToastUtils.showShort(updateAvatarBean.getImgUrl());
}else {
// hideLoading();
}
}
});
}
3.接口
@Multipart
@POST("system/user/profile/avatar")
LiveData<UpdateAvatarBean> updateAvatar(@Part MultipartBody.Part part);