Android调用相机拍照返回原图

在开始之前,先说下正常调用相机的状况:

正常调用相机,在

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_CODE);

然后重写onActivityResult

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        }
    }

在返回的data中的是一个压缩过的Bitmap,而且压缩的比较厉害,所以根本不会产生OOM异常,我试过之后,确实是一个清晰度相当低的一张图片,根本不能满足需求,所以就需要返回原图!!!当然这个原图是需要处理的,否则依然会出现OOM。

切入正题

首先理下思路:

1.定义一个Uri用来标记相机拍摄的照片
2.通过Intent启动相机,同时传递Uri
3.在onActivityResult方法中获取到拍摄图片的Uri,就能找到我们拍摄的原图

需要注意的是:
有的手机的Uri此时传递回onActivityResult时,通过data. getData()时为空,这时可以用一个变量引用之前的Uri 就好了

权限问题



启动相机代码:

                String state = Environment.getExternalStorageState();
                if (state.equals(Environment.MEDIA_MOUNTED)) {
                    File file = new File(path);
                    if (!file.exists()) {
                        file.mkdir();
                    }
                    String fileName = getPhotoFileName() + ".jpg";
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    photoUri = Uri.fromFile(new File(path + fileName));
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
                    startActivityForResult(intent, REQUEST_CODE);
                }

path:系统相册的路径

private String path = Environment.getExternalStorageDirectory() +
            File.separator + Environment.DIRECTORY_DCIM + File.separator;

"Environment.DIRECTORY_DCIM" 可以ctrl点进去看下,其实就是一个字符串,只不过是系统定义的,如下:

public static String DIRECTORY_DCIM = "DCIM";

getPhotoFileName():这个方法主要是实现对图片的命名,按照时间来命名,代码如下:

private String getPhotoFileName() {
        Date date = new Date(System.currentTimeMillis());
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
        return "IMG_" + dateFormat.format(date);
    }

onActivityResult回调的代码:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == REQUEST_CODE) {
            Log.d(TAG, "开始回调");
            Uri uri = null;
            if (data != null && data.getData() != null) {
                uri = data.getData();
            }
            if (uri == null) {
                if (photoUri != null) {
                    uri = photoUri;
                }
            } 
    }

其中photoUri,这里我定义了一个全局变量,和“启动相机”里面的Uri是同一个变量

Uri photoUri;

接下来,我们可以通过seturi()方法来设置UI

mImageView.setImageURI(photoUri);

同时这里也是需要注意:
由于现在手机像素都很高,拍摄的照片都很大,几M左右,这时如果直接设置到UI中,有时候会遇到OOM异常,接下来就是压缩图片的问题了

如有问题请拍砖

你可能感兴趣的:(Android调用相机拍照返回原图)