android调用拍照相册遇到的问题

今天弄了一个这个破地方,我也真是醉了。

开始我这么写:

 /** 拍照 */
private void takePhoto() {
    String sdState = Environment.getExternalStorageState();
    // 如果SD卡可读写
    if (sdState.equals(Environment.MEDIA_MOUNTED)) {
        new File(imgDir).mkdirs();
        File file = new File(imgFile);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        fragment.startActivityForResult(intent, TAKE_REQUEST);
    } else {
        MyToast.show(activity, "请确认已经插入SD卡");
    }
}
 /** 从相册获取 */
    private void getAlbum() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        fragment.startActivityForResult(intent, PICK_REQUEST);
    }


很简单是吧?是的android发展这么多年了,网上到处是这种,然后只要复写最后这个就行:

public void onActivityResult(int requestCode, int resultCode, Intent data, MyUri uri) {
	if (resultCode != activity.RESULT_OK) {
		return;
	}
	if (requestCode == PICK_REQUEST) {
		if (data.getData() != null) {
			uri.getUri(data.getData());
		}
	} else if (requestCode == TAKE_REQUEST) {
		if (data.getData() != null) {
			uri.getUri(data.getData());
		}
	}
}


我在三星s5上跑的挺好的,但是换了台手机到大神手机和努比亚z7上就不行了。调试了一会,发现data == null。

所以做了处理,当data == null的时候,我就去取data.getParcelableExtra("data");不为null,就跟之前的方法一样。

这样好了,努比亚的手机可以拿到拍照的图片进行裁剪了。不过图片是非常的模糊,按照网上的说法是这里返回了拍照图片的缩略图,所以要解决这个问题,不然肯定遭殃。于是就用原图来就行裁剪,所以改了一点代码:

/** 拍照 */
    private void takePhoto() {
        String sdState = Environment.getExternalStorageState();
        // 如果SD卡可读写
        if (sdState.equals(Environment.MEDIA_MOUNTED)) {
            new File(imgDir).mkdirs();
            File file = new File(imgFile);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
            fragment.startActivityForResult(intent, TAKE_REQUEST);
        } else {
            MyToast.show(activity, "请确认已经插入SD卡");
        }
    }

根据android的设计,说了一点如果是指明了拍照图片保存的地址,那么返回的data就是null。(但是我还是写了不为Null的条件,虽然大神F2在这还是会蹦,但是也没有特别好的办法了。。。)
接受回调的代码也做了相应的处理:

 public void onActivityResult(int requestCode, int resultCode, Intent data, MyUri uri) {
        if (resultCode != activity.RESULT_OK) {
            return;
        }
        if (requestCode == PICK_REQUEST) {
            if (data.getData() != null) {
                uri.getUri(data.getData());
            }
        } else if (requestCode == TAKE_REQUEST) {
            if (data != null) {
                Uri myUri;
                if (data.getData() != null) {
                    uri.getUri(data.getData());
                    return;
                }
                if (data.hasExtra("data")) {
                    Bitmap bitmap = data.getParcelableExtra("data");
                    try {
                        myUri = Uri.parse(MediaStore.Images.Media.insertImage(activity.getContentResolver(), bitmap, null, null));
                        uri.getUri(myUri);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            } else {
                try {
                    Bitmap bitmap = BitmapFactory.decodeFile(imgFile);
                    if (bitmap == null) {
                        return;
                    }
                    String s = MediaStore.Images.Media.insertImage(activity.getContentResolver(), bitmap, null, null);
                    Uri myUri = Uri.parse(s);
                    uri.getUri(myUri);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }


我试了努比亚z7,htc m9, 华为荣耀6 plus,小米2, 小米4, 都是OK的,唯独用大神F2的时候,就抛空指针异常。而且一直都是这句:

String s = MediaStore.Images.Media.insertImage(activity.getContentResolver(), bitmap, null, null);

bitmap那里不论传什么,Bitmap, String这2个参数都不行,而且我看了看源码,其实最后都是转化为bitmap这个参数来的。异常报的位置在源码里面,奶奶的,劳资纠结了好久。

大神F2,只要一调上面那段代码就蹦掉了。既然走不了这条路,我看到文件有种可以直接转为Uri的方法,所以最后我的代码是:

public void onActivityResult(int requestCode, int resultCode, Intent data, MyUri uri) {
    if (resultCode != activity.RESULT_OK) {
        return;
    }
    if (requestCode == PICK_REQUEST) {
        if (data.getData() != null) {
            uri.getUri(data.getData());
        }
    } else if (requestCode == TAKE_REQUEST) {
        if (data != null) {
            Uri myUri;
            if (data.getData() != null) {
                uri.getUri(data.getData());
                return;
            }
            if (data.hasExtra("data")) {
                Bitmap bitmap = data.getParcelableExtra("data");
                try {
                    myUri = Uri.parse(MediaStore.Images.Media.insertImage(activity.getContentResolver(), bitmap, null, null));
                    uri.getUri(myUri);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } else {
            File file = new File(imgFile);
            if (file != null && file.exists()) {
                uri.getUri(Uri.fromFile(file));
            }
        }
    }
}

基本上到这里,大神F2就可以正常的获取拍照图片进行裁剪了。困扰了劳资一天,这叫什么来着,有些路你不去走走,永远不知道路上回碰到什么,虽然那只是一条你就觉得很容易的路。




 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值