Android_照相机Camera_调用系统照相机返回data为空

本博文为子墨原创,转载请注明出处!

http://blog.csdn.net/zimo2013/article/details/16916279

1.调用系统照相机

//实例化一个intent,并指定action
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//指定一个图片路径对应的file对象
uri = Uri.fromFile(ImageUtil.getImageFile());
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
//启动activity
startActivityForResult(intent, REQUEST_CODE_CAMERA);

但是在onActivityResult(int requestCode, int resultCode, Intent data)代码中得到的data总为null?

2.原因分析

于是我查看了Android系统框架Camera应用程序,找到了关于系统照相机如何处理返回值data问题!

默认情况下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图。如果想访问原始图片,可以通过dat extra能够得到原始图片位置。即,如果指定了目标uri,data就没有数据,如果没有指定uri,则data就返回有数据!现在想想,这种设计还是很合理的!

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	switch (requestCode) {
	case REQUEST_CODE_CAMERA:
		if (resultCode == RESULT_OK) {
			if(data !=null){ //可能尚未指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
				//返回有缩略图
				if(data.hasExtra("data")){
					Bitmap thumbnail = data.getParcelableExtra("data");
					//得到bitmap后的操作
				}
			}else{
				//由于指定了目标uri,存储在目标uri,intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
				// 通过目标uri,找到图片
				// 对图片的缩放处理
				// 操作
			}
		}
	}
}

3.Android系统照相机部分关键源码

// First handle the no crop case -- just return the value.  If the
// caller specifies a "save uri" then write the data to it‘s
// stream. Otherwise, pass back a scaled down version of the bitmap
// directly in the extras.
if (mSaveUri != null) {	//存在mSaveUri,即指定了目标uri
	OutputStream outputStream = null;
	try {
		outputStream = mContentResolver.openOutputStream(mSaveUri);
		outputStream.write(data);
		outputStream.close();

		setResult(RESULT_OK);	//直接返回RESULT_OK,并没有指定intent
		finish();
	} catch (IOException ex) {
		// ignore exception
	} finally {
		Util.closeSilently(outputStream);
	}
} else {
	Bitmap bitmap = createCaptureBitmap(data);
	// 返回RESULT_OK,并包含一个Intent对象,其中Extra中科key为data,value为一个bitmap
	setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));
	finish();
}
时间: 2024-10-12 15:09:22

Android_照相机Camera_调用系统照相机返回data为空的相关文章

Android 调用系统照相机拍照和录像

本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

[android] 调用系统照相机和摄像机

查看系统照相机源码,找到清单文件查看 查看意图过滤器,action是android.media.action.IMAGE_CAPTURE category是android.intent.category.DEFAULT 获取Intent对象,通过new出来 调用Intent对象的setAction()方法,设置动作,参数:android.media.action.IMAGE_CAPTURE 调用Intent对象的setCategory()方法,设置分类,参数:android.intent.cat

关于调用系统照相机Activity被销毁问题解决

<activity                  android:name=".visitplan_finish"                  android:configChanges="keyboard|keyboardHidden|orientation" /> 经过实际测试有效. 主要是调用相机返回的是,activity由于横屏等原因自动销毁重建了,导致原有的数据丢失了. 两个解决方法: 方法1.在activity销毁前,保存当前act

Android调用系统相机、自定义相机、处理大图片

Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人SurfaceView出现黑屏的原因. Android应用拍照的两种方式,下面为两种形式的Demo展示出来的效果.    知识点: 一.调用系统自带的相机应用 二.自定义我们自己的拍照界面 三.关于计算机解析图片原理(如何正确加载图片到Android应用中) 所需

Android Camera 使用小结。两种方法:一是调用系统camera app,二是自己写camera程序。

源文链接:http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html Android Camera 使用小结 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Intent和MediaStroe调用系统Camera App程序来实现拍照和摄像功能,二是根据Camera API自写Came

安卓 调用系统相机并裁剪

做程序猿已有一段时间,东西也做了挺多,今天刚开通了博客,把我之前做过的东西记录下来,今天先写安卓系统下调用系统照相机并裁剪 之前做调用系统相机的时候遇到过很多问题,现在贴代码,在代码中一点点提出 btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent; String fileName = System.currentTimeMillis() + ".p

调用系统相机导致照片旋转问题的修复

如题,相信非常多开发人员在调用系统照相机接收拍好的照片时,发现照片被无故旋转了90度.这一问题反映在大部分的三星手机上,当然其它的机器还没试全然,总之是有问题. 于是乎想到例如以下的解决的方法: 识别机型,获取手机型号.然后推断是否须要旋转: 通过获取照片宽度和高度推断是否须要旋转: 自己动手写一个照相机Activity.自己来获取摄像头数据,保存照片: 分析发生旋转的照片数据.动态推断是否须要旋转,以及旋转正确的角度. 前三种方法均不是理想的解决方式. 首先说1:这样的相似于穷举的办法,总会有

Android调用系统相册和相机选择图片并显示在imageview中

Android调用系统相册和相机选择图片并显示在imageview中,在系统调用相机拍摄中,直接返回的是经过压缩处理后的图像,当你直接把返还后的图片放在imageview中时 图片就会非常的模糊,所以要经过先存放在sd中,然后在处理并显示.当调用系统相册时,因为Android系统从4.4版本以后系统不再返回真实的uri路径,而是封装过后的uri路径,所以当你写代码时必须注意,4.4是一个分水岭,4.4以上的版本必须就通过解析和相应的处理才能获取到真实的uri路径. 先上程序运行的结果. 这个是调

android 调用相册-照相机封装

把这两个功能封装起来,经常使用到. private static Uri photoUri; public static final int NONE = 0; public static final int PHOTOHRAPH = 1;// 拍照 public static final int PHOTOZOOM = 2; // 缩放 public static final int PHOTORESULT = 3;// 结果 public static final String IMAGE_