Android 4.4系统前后的调用系统相册和相机的问题

Android sdk升级之后 原来的Android-17编译的项目 现在使用Android-24编译 但是跑起来就出现了一些问题
这里主要就 在Android 4.4以前的版本和以后的版本上 调用系统的相册 和 相机 选取照片或拍照后 不能进入编辑界面,或者进入编辑界面编辑后,返回值为空的问题进行解决

1、从相册选取照片

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

上述代码,在4.4以前版本的手机上 没有任何问题,可以正常的调起相册,选择照片,进入编辑界面,编辑完成后返回数据。一套下来没有任何问题。可是,在6.0的手机上就出现的情况是—> 可以调起相册,但是在选择照片后 进入编辑界面的时候会崩。经过多方查询资料,最后把Intent里传入的null替换成 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
即如下写法:

Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

之后,问题解决,并且此代码在4.4以前版本的手机上也是没有问题的。

2、调用相机拍照

代码如下:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, 1);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0 && resultCode == Activity.RESULT_OK) { //从相册返回的数据
        if (data == null) {
            return;
        }
        startPhotoZoom(data.getData());
    } else if (requestCode == 1 && resultCode == Activity.RESULT_OK) {//从相机返回的数据
        if (Utils.isStrEmpty(tempPath)) {
            return;
        }
        File temp = new File(tempPath);
        startPhotoZoom(Uri.fromFile(temp));
    } else if (requestCode == 3 && resultCode == Activity.RESULT_OK) { // 返回裁剪之后的图片数据
        /**
        * 非空判断大家一定要验证,如果不验证的话, 在剪裁之后如果发现不满意,要重新裁剪,丢弃
        * 当前功能时,会报NullException,只 在这个地方加下,大家可以根据不同情况在合适的 地方做判断处理类似情况
        *
        */
        if (data != null) {
            setPicToView(data);
        } 
    }
}

我这里出现的问题是在4.4以前的版本的手机上调用相机拍照,正常进入编辑界面,编辑完成后返回数据。
一套下来没有任何问题。但是在6.0系统的手机上 编辑后就拿不到数据。可是通过Log信息看到返回的Intent里是有数据的。
代码如下:

private void setPicToView(Intent intent) {
    Bundle extras = intent.getExtras();
    try {
        if (extras != null) {
            bitmap = extras.getParcelable("data");
            ... ...
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这就很奇怪了 为什么intent里有数据可是就是拿不到呢?
在网上搜了N多文章都没找到具体是什么原因,最后自己尝试了各种方法,最后终于发现
原因就在于:4.4前后 调用系统相册和相机拍照并剪切后返回的Intent里的数据结构变化了。
4.4之前的intent结构是这样的:

Intent { (has extras) }

4.4之后的Intent结构就有了变化

Intent { dat=file:///storage/emulated/0/education/photo/1479969821748.jpg typ=image/jpeg }

知道原因,问题就好解决了,修改上边的代码如下:

private void setPicToView(Intent intent) {
    Bundle extras = intent.getExtras();
    try {
        if (extras == null) {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
        } else {
            bitmap = extras.getParcelable("data");
        }
        if (bitmap == null) {
            return;
        }
        ... ...
    } catch (Exception e) {
        e.printStackTrace();
    }
}

PS:在返回的Intent里如果能取到extras,就按照以前的流程走,一切正常。如果取不到extras 就直接通过剪切图片的时候传入的图片的uri 获取Bitmap,通过uri获取图片的方法如下:

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);

下边附上 何时给imageUri赋值的方法:

/**
* 剪切图片方法
* @param uri
*/
private void startPhotoZoom(Uri uri) {
    try {
        Intent intent = new Intent("com.android.camera.action.CROP");
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            String url = getPath(this, uri);
            intent.setDataAndType(Uri.fromFile(new File(url)), "image/*");
            imageUri = uri;
        } else {
            intent.setDataAndType(uri, "image/*");
        }

        //intent.setDataAndType(uri, "image/*");
        // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
        intent.putExtra("crop", "true");
        // aspectX aspectY 是宽高的比例
        //intent.putExtra("aspectX", 1);
        //intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪图片宽高
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, 3);
    } catch (ActivityNotFoundException e) {
        e.printStackTrace();
    }
}

通过以上几步的修改,调用系统相机和相册的问题 不管是在高版本的手机还是低版本的手机上 都得到了完美解决
PS:在setPicToView()方法没有修改之前 在6.0的手机上 不管是调用相册还是调用相机 进入剪切界面后 都是有问题的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值