调用系统相机 data返回null

1.调用系统照相机

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //实例化一个intent,并指定action  
  2. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  3. //指定一个图片路径对应的file对象  
  4. uri = Uri.fromFile(ImageUtil.getImageFile());  
  5. intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  6. //启动activity  
  7. 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就返回有数据!现在想想,这种设计还是很合理的!

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.     switch (requestCode) {  
  4.     case REQUEST_CODE_CAMERA:  
  5.         if (resultCode == RESULT_OK) {  
  6.             if(data !=null){ //可能尚未指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  7.                 //返回有缩略图  
  8.                 if(data.hasExtra("data")){  
  9.                     Bitmap thumbnail = data.getParcelableExtra("data");  
  10.                     //得到bitmap后的操作  
  11.                 }  
  12.             }else{  
  13.                 //由于指定了目标uri,存储在目标uri,intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  14.                 // 通过目标uri,找到图片  
  15.                 // 对图片的缩放处理  
  16.                 // 操作  
  17.             }  
  18.         }  
  19.     }  
  20. }  

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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. // First handle the no crop case -- just return the value.  If the  
  2. // caller specifies a "save uri" then write the data to it's  
  3. // stream. Otherwise, pass back a scaled down version of the bitmap  
  4. // directly in the extras.  
  5. if (mSaveUri != null) { //存在mSaveUri,即指定了目标uri  
  6.     OutputStream outputStream = null;  
  7.     try {  
  8.         outputStream = mContentResolver.openOutputStream(mSaveUri);  
  9.         outputStream.write(data);  
  10.         outputStream.close();  
  11.   
  12.         setResult(RESULT_OK);   //直接返回RESULT_OK,并没有指定intent  
  13.         finish();  
  14.     } catch (IOException ex) {  
  15.         // ignore exception  
  16.     } finally {  
  17.         Util.closeSilently(outputStream);  
  18.     }  
  19. else {  
  20.     Bitmap bitmap = createCaptureBitmap(data);  
  21.     // 返回RESULT_OK,并包含一个Intent对象,其中Extra中科key为data,value为一个bitmap  
  22.     setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));  
  23.     finish();  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值