今天弄了一个这个破地方,我也真是醉了。
开始我这么写:
/** 拍照 */
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就可以正常的获取拍照图片进行裁剪了。困扰了劳资一天,这叫什么来着,有些路你不去走走,永远不知道路上回碰到什么,虽然那只是一条你就觉得很容易的路。