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

    xiaoxiao2021-12-14  17

    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的手机上 不管是调用相册还是调用相机 进入剪切界面后 都是有问题的。

    转载请注明原文地址: https://ju.6miu.com/read-964888.html

    最新回复(0)