1.调用系统照相机

[java] view plaincopy

  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就返回有数据!现在想想,这种设计还是很合理的!

  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系统照相机部分关键源码

  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. setResult(RESULT_OK);   //直接返回RESULT_OK,并没有指定intent
  12. finish();
  13. } catch (IOException ex) {
  14. // ignore exception
  15. } finally {
  16. Util.closeSilently(outputStream);
  17. }
  18. } else {
  19. Bitmap bitmap = createCaptureBitmap(data);
  20. // 返回RESULT_OK,并包含一个Intent对象,其中Extra中科key为data,value为一个bitmap
  21. setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));
  22. finish();
  23. }
 
 

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

  1. android 调用系统照相机拍照后保存到系统相册,在系统图库中能看到

    需求:  调用系统照相机进行拍照,并且保存到系统相册,调用系统相册的时候能看到   系统相册的路径:String cameraPath= Environment.getExternalStorageD ...

  2. 解决ajaxfileupload上传文件在IE浏览器返回data为空问题

    关于ajaxfileupload,建议还是别用,已经没有人维护的脚本了,笔者就是入了这个坑. 在IE浏览器中ajaxfileupload返回data为空 jq.ajaxFileUpload ( { u ...

  3. Android调用系统照相机

    ndroid调用系统相机实现拍照功能 在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题. 虽然之前看过android开发的书,但是没 ...

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

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

  5. [项目总结]关于调用系统照相机Activity被销毁问题解决

    在项目中需要启用系统照相机来拍照.本来很容易的一个问题.但在适配中出现了问题. 简单说一下问题: 有些手机拍照成功,有些手机拍完照后确定返回后activity数据丢失,被销毁了. 问题查找: 经过代码 ...

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

    查看系统照相机源码,找到清单文件查看 查看意图过滤器,action是android.media.action.IMAGE_CAPTURE category是android.intent.categor ...

  7. IOS 调用系统照相机和相册

    /** *  调用照相机 */ - (void)openCamera { UIImagePickerController *picker = [[UIImagePickerController all ...

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

    <activity                  android:name=".visitplan_finish"                  android:co ...

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

    Android调用系统相机和自己定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,而且因为涉及到要把拍到的照片显示出来,该样例也会涉及到Android载入大图片时候的处 ...

随机推荐

  1. 咏南中间件JSON序列类

    咏南中间件JSON序列类 1)支持跨平台.跨语言 2)支持主从表数据序列.还原,支持任意数量的表 主从表数据序列为JSON字符串样式: { "rows": [ { "FD ...

  2. bat遍历目录

    方法一: for /r  D:\要遍历的目录\  %%i  (*.exe)  do ( echo  %%i ) 方法二: set DestPath=D:\你的目录\ rem 你的后缀 set Dest ...

  3. 亿级 Web 系统搭建:单机到分布式集群

    本文内容 Web 负载均衡 HTTP 重定向 反向代理 IP 负载均衡 DNS 负载均衡 Web 系统缓存机制的建立和优化 MySQL 数据库内部缓存 搭建多台 MySQL 数据库 MySQL 数据库 ...

  4. Duplicate复制数据库并创建物理StandBy(spfile+不同实例名+不同路径)

    过程和Duplicate复制数据库并创建物理StandBy类似,只是不需要重启数据库. 目的:创建standby,不重启源数据库 1设定环境如下: Primary数据库 IP 172.17.22.16 ...

  5. ORA-00959: tablespace 'TB01' does not exist

    当前的表空间如下: SQL> select name from v$tablespace; NAME ---------------------------------------------- ...

  6. What is `^M` and how do I get rid of it?

    When I open the file in vim, I am seeing strange ^M characters. Unfortunately, the world's favorite ...

  7. html元素不可见的三种方式

    html中使元素不可见有三种方法: 使用hidden属性 使用style中的display=none 使用style中的visibility=false 显然,使元素不可见有两类方式: 元素彻底不可见 ...

  8. Easyui 弹出加载中的遮罩的两种方法

    第一种: //弹出加载层function load() {      $("<div class=\"datagrid-mask\"></div> ...

  9. 关于c语言的左移运算

    对于任意w位的二进制,进行k位的移动时,真实的位移量为k mod w 32bit的例子 1 << 1 结果2 1 mod 32 => 11 << 32 结果1 32 mo ...

  10. MYSQL 线程池

    https://www.jianshu.com/p/88e606eca2a5 https://www.percona.com/doc/percona-server/LATEST/performance ...