retrofit 上传图片或文件,第三方库pictureselector

本文介绍了如何在Android应用中使用Retrofit与第三方库PictureSelector配合,实现实时获取用户选择的图片,包括裁剪、压缩功能,并处理相机和存储权限请求。重点展示了onResult回调中的详细数据获取和上传文件到服务器的过程。
摘要由CSDN通过智能技术生成

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值