Android中调用系统相机,图库以及裁切遇到的坑

前几天在做头像的注册,用到了裁切头像,那么面临一个问题,是用自定义的裁切还是系统的裁切,最后偷懒选择了系统的相机,图库,裁切,接下来又面临一个问题就是机型的适配,有的机型系统相机,图库对图片的要求不一样,然后就崩溃。
网上一搜一大把,基本都是一样,那个方法大部分的机型还是可以的,刚开始的时候我试了小米,三星,nexus,锤子,是可以的,可是突然nexus提示相机更新,然后我就更新了,可是更新之后蛋疼的问题出来了,拍照裁切完之后,系统相册提示崩溃,试了几次,改了几次,还是提示崩溃,我以为是系统的缘故,我还给google提了系统反馈。。。。可是静下心来搜噶了一次,发现了问题。。下面贴出代码,对比即可。。。

 /**
     * 调用系统的拍照功能
     **/
    private void startCamearPicCut(Dialog dialog) {
        intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra("camerasensortype", 2);// 调用前置摄像头
        intent.putExtra("autofocus", true);// 自动对焦
        intent.putExtra("fullScreen", false);// 全屏
        intent.putExtra("showActionIcons", false);
        startActivityForResult(intent, ExtraUtil.PHOTO_REQUEST_TAKEPHOTO);
    }

    /**
     * 开启图库
     **/
    private void startImageCaptrue(Dialog dialog) {
        dialog.dismiss();
        intent = new Intent(Intent.ACTION_PICK, null);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                "image/*");
        startActivityForResult(intent, ExtraUtil.PHOTO_REQUEST_GALLERY);
    }

    /**
     * 系统裁剪
     * **/
    private void startImageZoom(Uri uri) {
        int dp = 500;
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
        intent.putExtra("crop", "true");
        intent.putExtra("scale", true);// 去黑边
        intent.putExtra("scaleUpIfNeeded", true);// 去黑边
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", 1);//输出是X方向的比例
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高,切忌不要再改动下列数字,会卡死
        intent.putExtra("outputX", dp);//输出X方向的像素
        intent.putExtra("outputY", dp);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        intent.putExtra("return-data", false);//设置为不返回数据
        startActivityForResult(intent, ExtraUtil.PHOTO_REQUEST_CUT);
    }

这是所有机型都适用的系统方法,下面贴出之前的代码。。

/**
     * 系统裁剪
     * **/
    private void startImageZoom(Uri uri) {
        int dp = 500;
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
        intent.putExtra("crop", "true");
        intent.putExtra("scale", true);// 去黑边
        intent.putExtra("scaleUpIfNeeded", true);// 去黑边
        // aspectX aspectY 是宽高的比例
        intent.putExtra("aspectX", 1);//输出是X方向的比例
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高,切忌不要再改动下列数字,会卡死
        intent.putExtra("outputX", dp);//输出X方向的像素
        intent.putExtra("outputY", dp);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        intent.putExtra("return-data", true);//设置是否返回数据
        startActivityForResult(intent, ExtraUtil.PHOTO_REQUEST_CUT);
    }

调用相机,图库的一样,就是裁剪的地方有点点差别,就是是否返回数据,在最新的nexus上面裁剪完图片如果返回数据,就会崩溃,这里改成不返回数据,适用全局的uri即可,在onActivityResult方法中都处理uri即可。。。
现在先这样用着,以后可能会改成自定义的裁剪。。。
如果在项目中你们有用的好的头像上传,分享一下,嘿嘿

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老王学长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值