美文网首页Android开发Android技术知识半栈工程师
调用安卓原生的图片选择和剪裁程序对用户头像进行操作

调用安卓原生的图片选择和剪裁程序对用户头像进行操作

作者: 卖臭豆腐的王致和 | 来源:发表于2018-06-20 09:40 被阅读37次
    转载请注明原创出处,谢谢!

    小米note,亲测有效,其他均未测试,请注意!!!
    只适用于选择单张图片,例如设置用户头像。

    先看效果

    弹出选择框.png
    • 点击Button弹出选择头像对话框。


      选择图片.png
    • 选择一张图片。


      剪裁.png
    • 剪裁图片,设置到ImageView。

    核心代码

    public class SetActivity extends BaseActivity {
        private CircleImageView icon;
        String cameraPath;// 拍摄头像照片时SD卡的路径
    
        @Override
        protected void initView() {
            icon = (CircleImageView) findViewById(R.id.iv_icon);\
        }
    
        @Override
        protected void initListener() {
            findViewById(R.id.btn_icon_set).setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.btn_icon_set:
                    setAvatar();
                    break;
                default:
            }
        }
    
        private void setAvatar() {
            Intent intent1 = new Intent(Intent.ACTION_PICK);
            intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    
            Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File file = new File(
                    Environment
                            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                    System.currentTimeMillis() + ".jpg");
            cameraPath = file.getAbsolutePath();
            Uri uri = Uri.fromFile(file);
            intent2.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            Intent chooser = Intent.createChooser(intent1, "选择头像");
            chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{intent2});
            startActivityForResult(chooser, 101);// --------------->101
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            try {
                super.onActivityResult(requestCode, resultCode, data);
                if (resultCode == RESULT_OK) {
                    if (requestCode == 101) {// 获得未裁剪的照片 --------------->101
                        String filePath;
                        if (data != null) {
                            Uri uri = data.getData();
                            filePath = uri.getPath();
                        } else {
                            // 相机拍照
                            filePath = cameraPath;
                        }
                        crop(filePath)// 裁剪
                    }
                    if (requestCode == 102) {// 裁剪点击确定后执行 --------------->102
                        // 获得了系统截图程序返回的截取后的图片
                        final Bitmap bitmap = data.getParcelableExtra("data");
                        // 上传前,要将bitmap保存到SD卡
                        // 获得保存路径后,再上传
                        final File file = new File(
                                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                                System.currentTimeMillis() + ".jpg");
                        OutputStream stream = new FileOutputStream(file);
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                        // 上传头像数据并显示头像操作
                        // showProgressDialog();
                        // uploading();
                        // Glide.with(SetActivity.this).load(file.getPath()).into(icon);
                        // closeProgressDialog();
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 调用安卓的图片剪裁程序对用户选择的头像进行剪裁
         *
         * @param filePath
         *         用户选取的头像在SD上的地址
         */
        private void crop(String filePath) {
            // 隐式intent
            Intent intent = new Intent("com.android.camera.action.CROP");
            Uri data = Uri.fromFile(new File(filePath));
            // 设置剪裁数据 150*150
            intent.setDataAndType(data, "image/*");
            intent.putExtra("crop", true);
            intent.putExtra("return-data", true);
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            intent.putExtra("outputX", 150);
            intent.putExtra("outputY", 150);
            startActivityForResult(intent, 102);// --------------->102
        }
    }
    

    大概流程

    大概流程图.png

    相关文章

      网友评论

        本文标题:调用安卓原生的图片选择和剪裁程序对用户头像进行操作

        本文链接:https://www.haomeiwen.com/subject/isfmeftx.html