加载中…
个人资料
无语僧314
无语僧314
  • 博客等级:
  • 博客积分:0
  • 博客访问:239,923
  • 关注人气:29
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

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

(2017-01-17 16:35:30)
标签:

android

app

camera

拍照

分类: 嵌入式Android

版权声明:本文为原创文章,未经博主允许不得转载。http://blog.csdn.net/zimo2013

目录(?)[+]

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 "save uri" then write the data to it's  
  3. // stream. Otherwise, pass back 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();  
  24.  

 

4.常见问题及解决办法

 

如果我们设置了照片的存储路径,那么很可能会遇到一下三种问题:
问题一:onActivityResult 方法中的data 返回为空(数据表明,93%的机型的data 将会是Null,所以如果我们指定了路径,就不要使用data 来获取照片,起码在使用前要做空判断)
问题二:照片无法存储,如果自定义存储路径是/mnt/sdcard/lowry/,而手机SD 卡下在拍照前没有名为lowry 的文件夹,那么部分手机拍照后图片不会保存,导致我们无法获得照片,大多数手机的相机遇到文件夹不存在的情况都会自己创建出不存在的文件夹,而个别手机却不会创建,其代表机型为:三星I8258、华为H30-T00、红米等。解决的方法就是在指定存储路径前先判断路径中的文件夹是否都存在,不存在先创建再调用相机。
问题三:照片可以存储,但是名字不对
file:///mnt/sdcard/123 1.jpg,由于Uri 的fromFile 方法会将路径中的空格用“ ”取代。其实对于大多数的手机这都不算事,手机在解析存储路径的时候都会将“ ”替换为空格,这样实际上最终的照片名字还是我们当初指定的名字:123 1.jpg,遗憾的是个别手机(如酷派7260)系统自带的相机没有将“ ”读成空格,拍照后的照片的名字是123 1.jpg,我们用路径“file:///mnt/sdcard/123 1.jpg”能找到照片才怪!!


 

解决办法:

(1)使用 onActivityResult 中的 intent(data)前要做空判断。
(2)指定拍照路径时,先检查路径中的文件夹是否都存在,不存在时先创建文件夹再调用相机拍照。
(3)指定拍照存储路径时,照片的命名中不要包含空格等特殊符号。

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有