Android 调用系统相机进行拍照 使用自带的图片选择器和裁剪工具

一、背景

最近项目中用到了手机拍照,图片的选取的功能,这类功能差不多已经被用烂了,而且网上也有许多很好的第三方库,但是有的时候,项目对于这类功能并没有什么大的要求,只需要简单实现其功能即可。调用系统提供的方法肯定是最简单啦,虽然做出来的效果不如各种自定义的好看,但是功能上是一样一样滴,最关键的是,自己需要什么就实现什么就得了,代码很少。

二、概述

调用系统相机、使用手机自带的图片选择器、系统的裁剪功能

实现起来的思路其实也很简单,我们只需要使用 Intent 隐式启动系统的活动 activity,根据需要配置一下参数。

我们调用系统相机的时候,可以手动设置拍照完成后图片的输出路径,为什么需要手动设置,难道这个在系统拍照 activity finish 掉时不给我们回传吗,理论上数据都携带在了:

onActivityResult(int requestCode, int resultCode, Intent data)

这个方法的 data 之中,但是很操蛋的是,intent携带的数据量并不是无限的(最大携带数据量为 1M),随着现在手机拍照出来的图片越来越高清,intent的小三轮已经拉不动 800 斤的壮汉啦,所以系统在 data 里面就会给你返回一个 null,这个时候我们配置的图片路径就显出作用了,哈?有啥作用?有了图片路径那还不是你想咋地就咋地了。

代码实现起来很简单,但是需要注意权限的添加,而且自 android6.0 起,app不会在安装时授予权限,而是在运行时一个一个向用户询问是否授予权限。

1.代码直接贴出来了,比较简单,不太了解直接下载 demo 看看吧

    /**
     * 去调用系统相机
     */
    private void toOpenSystemCamera() {
        //调用拍照活动
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        //设置图片的输出地址
        intent.putExtra(MediaStore.EXTRA_OUTPUT, toCreateImageUri());
        startActivityForResult(intent, CAMERA_SUCCESS_CODE);
    }

    /**
     * 去创建一个拍照后文件输出的位置
     */
    private Uri toCreateImageUri() {
        File file = new File(Environment.getExternalStorageDirectory()
                , System.currentTimeMillis()+"cameratest.jpg");
        try {
            if (file.exists()) {
                file.delete();
            }
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        uri = Uri.fromFile(file);
        return uri;
    }
    /**
     * 打开系统相册
     */
    private void toOpenSystemPicture() {
        //打开系统资源库
        Intent intentSel = 
                new Intent(Intent.ACTION_PICK 
                        , MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intentSel, PICTURE_SUCCESS_CODE);
    }
    /**
     * 打开系统的剪切界面
     */
    private void toCropPicture(Uri iamgeUri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(iamgeUri, "image/*");
        //是否可以缩放
        intent.putExtra("scale", true);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, iamgeUri);
        startActivityForResult(intent, CROP_SUCCESS_CODE);
    }

源码点击下载

猜你喜欢

转载自blog.csdn.net/MingJieZuo/article/details/79667359