android 获取相册图片和使用相机照照片 并使用Android自带图片剪裁界面剪裁

1.获取图片

(1)获取本地图片

Intent intentFromGallery = null;
      //因4.4版本不同 所以两种URI
       //4.4以上
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            intentFromGallery = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            intentFromGallery.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
            } else {
            //4.4以下
            intentFromGallery = new Intent();
            intentFromGallery.setType("image/*");// 设置文件类型
            intentFromGallery.setAction(Intent.ACTION_GET_CONTENT); // 这个ACTION会调用相应文件类型的程序打开该文件
            intentFromGallery.addCategory(Intent.CATEGORY_OPENABLE);
            }
            startActivityForResult(intentFromGallery, Constants.IMAGE_AVATAR_REQUEST_CODE);

(2)拍照获得图片

private File cameraFile;
<pre name="code" class="java">private static String IMAGE_AVATAR_FILE_NAME = Constants.IMAGE_FILE_NAME;//这里只是写了一个静态常量,用于设置图片的路径

Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 启动Camera // 判断存储卡是否可以用,可用进行存储 if (CommonUtil.hasSdcard()) { File file = new File(Environment.getExternalStorageDirectory() + File.separator + Constants.IMAGE_FILE_FOLDER);//文件 if (!file.exists()) { file.mkdirs();// 创建文件夹 如果没有的话 } //当前时间 Date date = new Date(); date.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssS"); String timestr = sdf.format(date);
//随机数
 Random rad = new Random(); int a = rad.nextInt(100); Log.e("", "time" + timestr + "_" + a); //由随机数和时间产生一个照片的名 IMAGE_AVATAR_FILE_NAME = timestr + "_" + a; cameraFile = new File(Environment.getExternalStorageDirectory() + File.separator + Constants.IMAGE_FILE_FOLDER + File.separator + IMAGE_AVATAR_FILE_NAME + ".jpg"); Uri imgUri = Uri.fromFile(cameraFile); intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); startActivityForResult(intentFromCapture, Constants.CAMERA_AVATAR_REQUEST_CODE); }

 

这里的请求码随意设置,只用于标识了啦

2.剪裁图片代码

public void startPhotoZoom(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // CROP
        intent.putExtra("crop", "true");
        intent.putExtra("scale", true);// 去黑边
        intent.putExtra("scaleUpIfNeeded", true);// 去黑边
        // aspectX aspectY 是宽高的比例?边框?
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 320);
        intent.putExtra("outputY", 320);
        intent.putExtra("return-data", true);//这个如果是true intent里会有一个bitmap 在调用的时候 Bitmap photo = extras.getParcelable("data");得到,但只能是小bitmap太大出bug

        //用这个方法可以传大图片 在接收的地方用uri 再转bitmap

//        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
//        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
//        uriTemp = uri;

        startActivityForResult(intent, Constants.RESULT_AVATAR_REQUEST_CODE);
    }

3.保存剪裁之后的图片数据

private void getImageToView(Intent data) {
        Bundle extras = data.getExtras();
        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");

            Drawable drawable = new BitmapDrawable(photo);
            //定义一个ImageView imgAvatar 显示裁剪之后的图片
           imgAvatar.setImageDrawable(drawable);
            //把base64存起来
            String base64Avatar = CommonUtil.bitmapToString(photo);
            //把头像存到sharedpreferences里一份
            CommonUtil.saveAvatarString(mContext, base64Avatar);

            //可以在这里把头像上传到后台
           // UploadImgAndGetImgUrl mUploadGetUrl = new UploadImgAndGetImgUrl(photo, Constants.JPG, new OnAvatarGotListener());
            //上传 会在回调里给一个url
           // mUploadGetUrl.uploadAndGetTask();
            //mProgressDialogLogo.show();
            //ToastUtil.showToastShort(mContext, "图片上传中");
        }
    }

4.在onActivityResult中操作


 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // 结果码不等于取消时候
        if (resultCode != RESULT_CANCELED) {
            switch (requestCode) {
                //从相册回来
                case Constants.IMAGE_AVATAR_REQUEST_CODE:
                    startPhotoZoom(data.getData());// data.getDAta() uri
                    break;
                 //从相机回来
                case Constants.CAMERA_AVATAR_REQUEST_CODE:
                     //查看是否有SD卡
                    if (CommonUtil.hasSdcard()) {
                        startPhotoZoom(Uri.fromFile(cameraFile));
//			Uri fileUri=ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_FILE_NAME);
//			Uri fileUri=Uri.parse(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString()+File.separator+IMAGE_FILE_NAME);
//			startPhotoZoom(fileUri);
                    } else {
                        ToastUtil.showToastShort(mContext, "未找到存储卡,无法存储照片!");
                    }
                    break;
                case Constants.RESULT_AVATAR_REQUEST_CODE:
                    //从剪裁回来
                    if (data != null) {
                        getImageToView(data);
                    }
                    break;
            }
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

实际操作过程中遇到了一个问题,那就是用相机拍照之后点击对号,不能跳转至裁剪界面,(你以为是机型不匹配问题? NO!你以为是路径不行?NO!)麻蛋!清单文件中要加获得路径的权限!

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
就是这个啦.....大家引以为戒哦

小菜鸟学习ing...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值