今天弄了一个这个破地方,我也真是醉了。
开始我这么写:
/** 拍照 */ 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就可以正常的获取拍照图片进行裁剪了。困扰了劳资一天,这叫什么来着,有些路你不去走走,永远不知道路上回碰到什么,虽然那只是一条你就觉得很容易的路。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/zhoudailiang/article/details/48055869