关于android剪裁的一些坑

网上搜索一大推的例子,但是当真正运行时会出现一些兼容性问题。


首先看个例子:这是从相册获取图片然后剪裁,如果是照相需要把action替换android.media.action.IMAGE_CAPTURE。


final int crop = 180;
Intent intent = new Intent("android.intent.action.PICK");
intent.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
intent.putExtra("output", Uri.fromFile(sdcardTempFile));
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);// 裁剪框比例
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", crop);// 输出图片大小
intent.putExtra("outputY", crop);
intent.putExtra("return-data", true);
startActivityForResult(intent, REQUEST_CODE_CROP_PIC);

看着好像没有什么问题,运行时如果幸运的话,就OK了。


接下来测试,突然发现在6.0上面出现

1.“有些手机或高版本手机不支持照相后直接进行剪裁,所以需要照相后的图片进行剪裁”

所以,需要在调用照相机的时候去掉剪裁,在返回结果中进行剪裁,于是乎就出现了如下代码:


    private void addCapture() {
        final int crop = 180;
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        intent.putExtra("output", Uri.fromFile(sdcardTempFile));
//        intent.putExtra("crop", "true");
//        intent.putExtra("aspectX", 1);// 裁剪框比例
//        intent.putExtra("aspectY", 1);
//        intent.putExtra("outputX", crop);// 输出图片大小
//        intent.putExtra("outputY", crop);
        startActivityForResult(intent, REQUEST_CODE_CROP_CAP);
    }
在onActivityResult的REQUEST_CODE_CROP_CAP调用下面代码

//为了适配魅族(奇怪的现象,照相可以使用自定义的路径,相册必须使用系统的Uri)
                corpCapture(Uri.fromFile(sdcardTempFile));

private void corpCapture(Uri uri) {
    final int crop = 180;
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("output", Uri.fromFile(sdcardTempFile));
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);// 裁剪框比例
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", crop);// 输出图片大小
    intent.putExtra("outputY", crop);
    startActivityForResult(intent, REQUEST_CODE_IMAGE);
}

2.good,好像完美的解决了一个问题,继续测试。。。


喔噢,魅族(个性使然)上出现相册中获取的图片无法剪裁,原因是不能用输出的自定义路径(更变态的是照相不能使用系统返回的Uri,只能是自定义的路径)。于是有了以下代码:

    private void addImage() {
        final int crop = 180;
        Intent intent = new Intent("android.intent.action.PICK");
        intent.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
//        intent.putExtra("output", Uri.fromFile(sdcardTempFile));
//        intent.putExtra("crop", "true");
//        intent.putExtra("aspectX", 1);// 裁剪框比例
//        intent.putExtra("aspectY", 1);
//        intent.putExtra("outputX", crop);// 输出图片大小
//        intent.putExtra("outputY", crop);
//        intent.putExtra("return-data", true);
        startActivityForResult(intent, REQUEST_CODE_CROP_PIC);
    }
然后在onActivityResult的REQUEST_CODE_CROP_PIC调用下面代码

                Uri selectedImage = data.getData();
                corpCapture(selectedImage);


完整的onActivityResult里面的代码如下:

            case REQUEST_CODE_CROP_PIC:
                //有些手机或高版本手机不支持照相后直接进行剪裁,所以需要照相后的图片进行剪裁
                Uri selectedImage = data.getData();
                corpCapture(selectedImage);
//                corpCapture(Uri.fromFile(sdcardTempFile));
                break;
            case REQUEST_CODE_CROP_CAP:
                //为了适配魅族(奇怪的现象,照相可以使用自定义的路径,相册必须使用系统的Uri                corpCapture(Uri.fromFile(sdcardTempFile));
                break;


暂时测试手上的机器都没有问题了,有问题的各位朋友可以回复下,未完待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值