您当前的位置: 首页 >  android

Kevin-Dev

暂无认证

  • 0浏览

    0关注

    544博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Android -- 相机】TakePhoto 实现拍照、相册以及裁剪图片

Kevin-Dev 发布时间:2019-12-09 09:14:06 ,浏览量:0

一、简介

TakePhoto 是一款用于在 Android 设备上获取照片(拍照或从相册、文件中选择)、裁剪图片、压缩图片的开源工具库,目前最新版本 4.0.3。

  • 使用自带的相机 APP 拍照
  • 系统相册选择照片
  • 系统相机或相册获取的照片裁剪
二、效果图

01.png

02.png

03.png

三、使用

1. 添加依赖

    // 申请权限
    implementation 'com.tbruyelle.rxpermissions2:rxpermissions:+'
    implementation 'com.jph.takephoto:takephoto_library:4.0.3'
    //glide
    implementation 'com.github.bumptech.glide:glide:4.12.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'

2. 清单文件中添加权限





3. popup_take_photo.xml




    

    

    

    

    


4. 代码逻辑 (1) 继承 TakePhotoActivity (2) 重写 takeSuccess,takeFail,takeCancel 方法 (3) 设置动态权限,适配6.0以上设备

public class PersonalInfoActivity extends TakePhotoActivity {
    @BindView(R.id.iv_head)
    ImageView headImg;

    private CommonPopupWindow popupWindow;
    private TakePhoto takePhoto;
    private CropOptions cropOptions;    //裁剪参数
    private CompressConfig compressConfig;  //压缩参数
    private Uri imageUri;

    private static final String[] permissionsGroup = new String[]{
            Manifest.permission.CALL_PHONE,
            Manifest.permission.CAMERA,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_personal_info);
        ButterKnife.bind(this);
        initView();
        initData();
    }

    private void initData() {
        takePhoto = getTakePhoto();

        //设置裁剪参数
        cropOptions = new CropOptions.Builder().setAspectX(1).setAspectY(1).setWithOwnCrop(false).create();

        //设置压缩参数
        compressConfig = new CompressConfig.Builder().setMaxSize(50 * 1024).setMaxPixel(800).create();
        takePhoto.onEnableCompress(compressConfig, true);    //设置为需要压缩
    }

    private void initView() {
        checkPermissionRequest();
    }

    @OnClick({R.id.rl_info_phone,R.id.rl_info_head})
    public void onClicked(View view) {
        switch (view.getId()) {
            case R.id.rl_info_head :
                showPopupWindow();
                break;

            case R.id.rl_info_phone :

                break;

            default:
                break;
        }
    }

    @Override
    public void takeSuccess(TResult result) {
        super.takeSuccess(result);
        String iconPath = result.getImage().getOriginalPath();
        Glide.with(this).load(iconPath).into(headImg);
    }

    @Override
    public void takeFail(TResult result, String msg) {
        super.takeFail(result, msg);
    }

    @Override
    public void takeCancel() {
        super.takeCancel();
    }

    private void showPopupWindow() {
        if (popupWindow != null && popupWindow.isShowing()) {
            return;
        }

        View popView = View.inflate(this,R.layout.popup_take_photo,null);

        popupWindow = new CommonPopupWindow.Builder(this)
                .setView(R.layout.popup_take_photo)
                .setAnimationStyle(R.style.AnimUp)
                .setBackGroundLevel(0.5f)
                .setWidthAndHeight(980,400)
                .setViewOnclickListener(new CommonPopupWindow.ViewInterface() {
                    @Override
                    public void getChildView(View view, int layoutResId) {
                        TextView photograph = view.findViewById(R.id.tv_avatar_photograph);
                        TextView selPhoto = view.findViewById(R.id.tv_avatar_photo);
                        TextView cancel = view.findViewById(R.id.tv_avatar_cancel);

                        photograph.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (popupWindow != null) {
                                    popupWindow.dismiss();
                                }

                                imageUri = getImageCropUri();
                                //仅仅拍照不裁剪
//                                takePhoto.onPickFromCapture(imageUri);

                                //拍照并裁剪
                                takePhoto.onPickFromCaptureWithCrop(imageUri, cropOptions);
                            }
                        });

                        selPhoto.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (popupWindow != null) {
                                    popupWindow.dismiss();
                                }
                                imageUri = getImageCropUri();

                                //从相册中选取不裁剪
//                                takePhoto.onPickFromGallery();
                                //从相册中选取图片并裁剪
                                takePhoto.onPickFromGalleryWithCrop(imageUri, cropOptions);
                            }
                        });

                        cancel.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (popupWindow != null) {
                                    popupWindow.dismiss();
                                }
                            }
                        });

                    }
                })
                .setOutsideTouchable(true)
                .create();

        popupWindow.showAtLocation(popView, Gravity.BOTTOM,0,50);
    }

    //获得照片的输出保存Uri
    private Uri getImageCropUri() {
        File file = new File(Environment.getExternalStorageDirectory(), "/temp/" + System.currentTimeMillis() + ".jpg");
        if (!file.getParentFile().exists()) file.getParentFile().mkdirs();
        return Uri.fromFile(file);
    }

     public void checkPermissionRequest() {
        new RxPermissions(this)
                .request(permissionsGroup)
                .subscribe(new Observer() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Boolean aBoolean) {
                        Log.d("amy", "onNext: "+aBoolean);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

}
关注
打赏
1658837700
查看更多评论
立即登录/注册

微信扫码登录

0.0477s