选择照片、拍照裁剪上传

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

  1. 布局文件
  2. Java代码

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="circleimageview.myself.com.croppicturedemo.MainActivity">

<Button
    android:id="@+id/btn_pic"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="相册" />

<Button
    android:id="@+id/btn_cammer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/btn_pic"
    android:text="相机" />

<de.hdodenhof.circleimageview.CircleImageView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/iv"
    android:layout_width="96dp"
    android:layout_height="96dp"
    app:civ_border_color="#FF000000"
    app:civ_border_width="2dp" />
</RelativeLayout>

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卡");
    }
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值