当前位置: 代码迷 >> Android >> android调用拍照相册遇到的有关问题
  详细解决方案

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

热度:98   发布时间:2016-04-27 23:14:20.0
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就可以正常的获取拍照图片进行裁剪了。困扰了劳资一天,这叫什么来着,有些路你不去走走,永远不知道路上回碰到什么,虽然那只是一条你就觉得很容易的路。




 

版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案