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

转载请注明原创出处,谢谢!
  • GitHub: @Ricco

小米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

你可能感兴趣的:(调用安卓原生的图片选择和剪裁程序对用户头像进行操作)