天天看点

根据指定路劲调用系统相机进行拍照

使用Intent调用系统中的相机进行拍摄时,不需要camera权限。需要给Intent设置MediaStore.ACTION_IMAGE_CAPTURE动作

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
           

如果需要指定拍摄时的照片存储路劲,需要设置putExtra

intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);
           

前面key是指示需要存储照片到指定路劲。后面的fileUri是指定存储路劲的Uri。

Note:当指定拍摄时的存储路劲后,onActivityResult中的data参数将会变成null,由于这个方法中的回调对应的路劲是系统默认的,所以将没有数据被回调出来。

启动相机完整代码:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,fileUri);
        startActivityForResult(intent,1);
           

当调用相机结束后,将会回调onActivityResult方法,可以在该方法中获取对应的图片(当没有指定路径时,图片是保存在data参数中的,可以直接获取。如果设置了,则需要根据自己设置的路劲去寻找图片)。

没有设置路劲时,获取图片代码:

Bitmap bitmap = data.getParcelableExtra("data");
           

当设置路径后,data为null,则需:

Bitmap bitmap = BitmapFactory.decodeFile(path,options);
           

如果要设置到ImageView上,最好进行压缩,否则可能出现OOM错误。

onActivity完整代码:(XML文件仅有一个点击按钮,和一个ImageView就不贴了)

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1 && resultCode == RESULT_OK){
            if (data != null) {//没有设置指定路径
                if (data.hasExtra("data")) {
                    Bitmap bitmap = data.getParcelableExtra("data");
                    imageView.setImageBitmap(bitmap);
                }
            }else {//设置了指定路劲
                    String path = fileUri.getPath();
                    Bitmap bitmap = Utils.compressImg(path,imageView);
                    imageView.setImageBitmap(bitmap);
            }
        }
    }
           

获取fileUri的代码:

private static Uri getOutputMediaFileUri(int type){
        return Uri.fromFile(getOutputMediaFile(type));
    }

    private static File getOutputMediaFile(int type){

        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), "MyCameraApp");
        if (! mediaStorageDir.exists()){
            mediaStorageDir.mkdirs();
        }else {
            Log.d("forme","exists !!");
        }

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        File mediaFile;
        if (type == MEDIA_TYPE_IMAGE){
            mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                    "IMG_"+ timeStamp + ".jpg");
        }  else {
            return null;
        }
        if (!mediaFile.exists()){
            try {
                mediaFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return mediaFile;
    }
           

Utils.compressImg是进行图片的压缩,其中在指定ImageView的大小的时候,最好不要用match_parent,不然在获取宽高的时候,无法判断宽高是多少

public static Bitmap compressImg(String path, ImageView imageView){
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        options.inSampleSize = 1;
        Bitmap bitmap = BitmapFactory.decodeFile(path,options);
        int height = imageView.getHeight();
        int width = imageView.getWidth();
        int bitHeight = options.outHeight;
        int bitWidth = options.outWidth;
        while (bitHeight>height || bitWidth>width){
            options.inSampleSize *= 2;
            bitHeight /= options.inSampleSize;
            bitWidth /= options.inSampleSize;
        }
        options.inJustDecodeBounds = false;
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        bitmap = BitmapFactory.decodeFile(path,options);
        return bitmap;
    }
           

以上是关于根据指定路劲调用系统相机进行拍照的全部代码

继续阅读