您的位置:首页 > 移动开发 > Android开发

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

2016-12-02 16:07 561 查看
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的手机上 不管是调用相册还是调用相机 进入剪切界面后 都是有问题的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android sdk 4-4 相机 相册