选择照片、拍照裁剪上传

来源:互联网 发布:java compareto返回值 编辑:程序博客网 时间:2024/05/17 05:15

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

  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;@Overrideprotected 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);}@Overridepublic void onClick(View v) {    switch (v.getId()) {        case R.id.btn_pic:            openPic();            break;        case R.id.btn_cammer:            openCamera();            break;    }}@Overrideprotected 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卡");    }}}
0 0
原创粉丝点击