当前位置: 代码迷 >> Android >> Android_相机Camera_调用系统照相机返回data为空
  详细解决方案

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

热度:90   发布时间:2016-04-28 02:16:00.0
Android_照相机Camera_调用系统照相机返回data为空

?

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

?

本博文为子墨原创,转载请注明出处!
http://blog.csdn.net/zimo2013/article/details/16916279
?

1.调用系统照相机

//实例化一个intent,并指定actionIntent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//指定一个图片路径对应的file对象uri = Uri.fromFile(ImageUtil.getImageFile());intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);//启动activitystartActivityForResult(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就返回有数据!现在想想,这种设计还是很合理的!

@Overrideprotected 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();}

?

?

?

?

?

?

?

  相关解决方案