Android 4.4系统前后的调用系统相册和相机的问题
2016-12-02 16:07
591 查看
Android sdk升级之后 原来的Android-17编译的项目 现在使用Android-24编译 但是跑起来就出现了一些问题
这里主要就 在Android 4.4以前的版本和以后的版本上 调用系统的相册 和 相机 选取照片或拍照后 不能进入编辑界面,或者进入编辑界面编辑后,返回值为空的问题进行解决
1、从相册选取照片
上述代码,在4.4以前版本的手机上 没有任何问题,可以正常的调起相册,选择照片,进入编辑界面,编辑完成后返回数据。一套下来没有任何问题。可是,在6.0的手机上就出现的情况是—> 可以调起相册,但是在选择照片后 进入编辑界面的时候会崩。经过多方查询资料,最后把Intent里传入的null替换成 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI
即如下写法:
之后,问题解决,并且此代码在4.4以前版本的手机上也是没有问题的。
2、调用相机拍照
代码如下:
我这里出现的问题是在4.4以前的版本的手机上调用相机拍照,正常进入编辑界面,编辑完成后返回数据。
一套下来没有任何问题。但是在6.0系统的手机上 编辑后就拿不到数据。可是通过Log信息看到返回的Intent里是有数据的。
代码如下:
这就很奇怪了 为什么intent里有数据可是就是拿不到呢?
在网上搜了N多文章都没找到具体是什么原因,最后自己尝试了各种方法,最后终于发现
原因就在于:4.4前后 调用系统相册和相机拍照并剪切后返回的Intent里的数据结构变化了。
4.4之前的intent结构是这样的:
4.4之后的Intent结构就有了变化
知道原因,问题就好解决了,修改上边的代码如下:
PS:在返回的Intent里如果能取到extras,就按照以前的流程走,一切正常。如果取不到extras 就直接通过剪切图片的时候传入的图片的uri 获取Bitmap,通过uri获取图片的方法如下:
下边附上 何时给imageUri赋值的方法:
通过以上几步的修改,调用系统相机和相册的问题 不管是在高版本的手机还是低版本的手机上 都得到了完美解决
PS:在setPicToView()方法没有修改之前 在6.0的手机上 不管是调用相册还是调用相机 进入剪切界面后 都是有问题的。
这里主要就 在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的手机上 不管是调用相册还是调用相机 进入剪切界面后 都是有问题的。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件