解决Android部分手机图片剪切返回崩溃问题

    下面是针对于7.0及以上的系统,对于7.0系统谷歌官方对于文件的访问权限做了更为严格的要求,需要使用FileProvider,Android的从 N 开始不允许以file://的方式通过Intent在两个App之间分享文件,的取而代之的英文通过FileProvider生成content://Uri 。如果在Android N 以上的版本继续使用file://方式分享文件,则系统会直接抛出异常,导致App出现 Crash,使用系统自带的intent来实现拍照,相册选择图片后剪切功能时,会遇到返回崩溃的问题。关于FileProvider网上示例很多,也可以参考官方文档原因是设置如下属性时,intent.putExtra("return-data", true);  通过Intent中的data来传递,当数据过大,即超过1M(经测试,这个数值在不同手机还不一样)时就崩了!!!!

imageCropUri = getUri();

private Uri getUri() {
    File tmpDir = new File(Environment.getExternalStorageDirectory() + "/image/");
    if (!tmpDir.exists()) {
        tmpDir.mkdirs();
    }
    File img = new File(tmpDir.getAbsolutePath() + "/pic.jpeg");
    if (img.exists()) {
        img.delete();
    }
    return Uri.fromFile(img);
}

Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, GALLERY_REQUEST_CODE);

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == GALLERY_REQUEST_CODE && resultCode == RESULT_OK) {
            if (data == null) {//相册
                return;
            }
            Uri urifile = data.getData();
//            Uri curi = convertUri(urifile);
//            startImageZoom(curi);
            startImageZoom(urifile);
        }else if (requestCode == CROP_REQUEST_CODE && resultCode == RESULT_OK) {
            if (data == null) {
                return;
            }
//            //剪裁后的图片
//            Bundle extras = data.getExtras();
//            if (extras == null) {
//                return;
//            }
//            Bitmap bm = extras.getParcelable("data");
//            Uri uri = saveBitmap(bm);
//            setImageToView(data);
            onStarted();
            //调用接口
            presenter.modifyAvatar(imageCropUri.getEncodedPath(), “接口地址”);
        }
    }

/**
 * 剪裁图片
 * @param uri
 */
private void startImageZoom(Uri uri) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", 300);
    intent.putExtra("outputY", 300);
    intent.putExtra("scale", true);
    intent.putExtra("return-data", false);
    intent.putExtra("noFaceDetection",true);
    //裁剪之后,保存在裁剪文件中,关键
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageCropUri);
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    startActivityForResult(intent, CROP_REQUEST_CODE);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值