选择照片、拍照裁剪上传

在做项目时免不了要上传用户头像这些操作,有时是从相册里面直接取,有时是使用照相机拍照过后进行截图的,现在来实现以下这两种方法。

  1. 布局文件
  2. Java代码

布局文件,使用了个第三方的圆形ImageView:




java代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

/**
 * 指定拍摄图片文件位置避免获取到缩略图
 */
private File outFile;
/**
 * 选择头像相册选取
 */
private static final int REQUESTCODE_PICK = 1;
/**
 * 裁剪好头像-设置头像
 */
private static final int REQUESTCODE_CUTTING = 2;
/**
 * 选择头像拍照选取
 */
private static final int PHOTO_REQUEST_TAKEPHOTO = 3;
/**
 * 裁剪好的头像的Bitmap
 */
private Bitmap currentBitmap;
private CircleImageView iv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button btn_pic = (Button) findViewById(R.id.btn_pic);
    Button btn_cammer = (Button) findViewById(R.id.btn_cammer);
    btn_pic.setOnClickListener(this);
    btn_cammer.setOnClickListener(this);

    iv = (CircleImageView)findViewById(R.id.iv);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btn_pic:
            openPic();
            break;
        case R.id.btn_cammer:
            openCamera();
            break;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //  进行判断是那个操作跳转回来的,如果是裁剪跳转回来的这块就要把图片现实到View上,其他两种的话都把数据带入裁剪界面
    switch (requestCode) {
        //相册
        case REQUESTCODE_PICK:
            if (data == null || data.getData() == null) {
                return;
            }
            startPhotoZoom(data.getData());
            //图片的路径
            String s = data.getData().getPath().toString();
            Log.i("ss","相片的路径:"+s);
            break;
        //裁剪
        case REQUESTCODE_CUTTING:
            if (data != null) {
                setPicToView(data);
            }
            break;
        //拍照
        case PHOTO_REQUEST_TAKEPHOTO:
            startPhotoZoom(Uri.fromFile(outFile));
            //图片的路径
            String s2 = Uri.fromFile(outFile).getPath().toString();
            Log.i("ss","照相机照的照片路径:"+s2);
            break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

/**
 * 把裁剪好的图片设置到View上或者上传到网络
 *
 * @param data
 */
private void setPicToView(Intent data) {
    Bundle extras = data.getExtras();
    if (extras != null) {
        /** 可用于图像上传 */
        currentBitmap = extras.getParcelable("data");
        iv.setImageBitmap(currentBitmap);
    }
}

/**
 * 调用系统的图片裁剪
 *
 * @param data
 */
private void startPhotoZoom(Uri data) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(data, "image/*");
    intent.putExtra("crop", true);
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", 300);
    intent.putExtra("outputY", 300);
    intent.putExtra("scale", true);//黑边
    intent.putExtra("scaleUpIfNeeded", true);//黑边
    intent.putExtra("return-data", true);
    intent.putExtra("noFaceDetection", true);
    Uri cropUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory().getPath() + "/wangjunling/image/crop.png"));
    intent.putExtra(MediaStore.EXTRA_OUTPUT,cropUri);
    startActivityForResult(intent, REQUESTCODE_CUTTING);

    String s1 = cropUri.getPath().toString();
    Log.i("ss","截图的路径:"+s1);
}
/**
 * 打开相册
 */
private void openPic() {
    Intent pickIntent = new Intent(Intent.ACTION_PICK, null);
    pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
    startActivityForResult(pickIntent, REQUESTCODE_PICK);
}
/**
 * 打开相机
 */
private void openCamera() {
    String state = Environment.getExternalStorageState();
    if (state.equals(Environment.MEDIA_MOUNTED)) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File outDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
        if (!outDir.exists()) {
            outDir.mkdirs();
        }
        outFile = new File(outDir, System.currentTimeMillis() + ".jpg");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outFile));
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO);
    } else {
        Log.e("CAMERA", "请确认已经插入SD卡");
    }
}
}

你可能感兴趣的:(Android开发)