关于安卓图片剪切造成软件崩溃问题的解决方法

关于安卓图片剪切造成软件崩溃问题的解决方法

在项目编写过程中由于需要运用到图片的剪切处理,并在其中走了许多的弯路,浪费了很多的时间,再次对此问题的解决方法与各位分享一下,一方面能给遇到同样问题的小猿们提供更便捷更迅速的解决方法,另一方便也给自己加深下印象。

一般图片处理的几个步骤都是这样的:

  • 调用摄像机
  • 调用系统相册
  • 调用系统剪切
    // 调用系统相机
    protected void startCamera(DialogInterface dialog) {
        dialog.dismiss();
        // 调用系统的拍照功能
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra("camerasensortype", 2); // 调用前置摄像头
        intent.putExtra("autofocus", true); // 自动对焦
        intent.putExtra("fullScreen", false); // 全屏
        intent.putExtra("showActionIcons", false);
        // 指定调用相机拍照后照片的存储路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
        startActivityForResult(intent, PHOTO_CARMERA);
    }

    // 调用系统相册
    protected void startPick(DialogInterface dialog) {
        dialog.dismiss();
        Intent intent = new Intent(Intent.ACTION_PICK, null);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                "image/*");
        startActivityForResult(intent, PHOTO_PICK);
    }

    // 调用系统裁剪
    private void startPhotoZoom(Uri uri, int size) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // crop为true是设置在开启的intent中设置显示的view可以裁剪
        intent.putExtra("crop", true);
        // aspectX,aspectY是宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX,outputY是裁剪图片的宽高
        intent.putExtra("outputX", size);
        intent.putExtra("outputY", size);
        // 设置是否返回数据
        intent.putExtra("return-data", true);
        startActivityForResult(intent, PHOTO_CUT);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        case PHOTO_CARMERA:
            if (null != data) {
                startPhotoZoom(Uri.fromFile(tempFile), 300);
            }   
            break;
        case PHOTO_PICK:
            if (null != data) {
                startPhotoZoom(data.getData(), 300);
            }
            break;
        case PHOTO_CUT:
            if (null != data) {
                setPicToView(data);
            }
            break;
        default:
            break;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

但我们在真机上测试之后发现通过摄像机拍照,然后进入剪切步骤时有时会出现崩溃状况,而调用系统相册再剪切则不会。上网查了好多解决办法,有的甚至代码很复杂,确都没能很好的解决此问题。

在这里教大家一个简单粗暴的解决方式:
修改前:
这里写图片描述
修改后:
这里写图片描述

总结

经过反复试验,发现问题就是处在系统所给的uri上,那么我们就不用系统的获取uri的方法,直接将uri写死,并通过这个uri来获取需要剪切的图片。这样就不用去担心系统给的是file还是content的区别了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值