现在市场上很多app都有拍照功能,一般简单的拍照使用系统的拍照功能就足够了,复杂一些的需要自定义camera去实现。

使用系统的拍照功能一般代码实现如下:

/**  * 调用系统拍照功能  */  @Override  public void onClick(View v) {          switch (v.getId()) {          case R.id.bt_take_photo:                    if( Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ){                    Intent intent = new Intent();                    try {                         fileName = getPhotoFileName();                         mPhotoPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/DCIM/Camera/" + fileName;                           mPhotoFile = new File(mPhotoPath);                         if( !mPhotoFile.exists() ){                              mPhotoFile.createNewFile();                         }                    } catch (Exception e) {                         e.printStackTrace();                    }                    intent.setAction("android.media.action.IMAGE_CAPTURE");                    intent.addCategory("android.intent.category.DEFAULT");                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mPhotoFile));//将拍照后图片保存到指定目录                    startActivityForResult(intent, TAKE_PICTURE);                }else {                    ToastUtil.showShortToast(context, "请确认插入SD卡");                }                    break;               default:                break;           }  }


   
/*** 获取拍照得到的图片*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if( requestCode == TAKE_PICTURE && resultCode == RESULT_OK ){if( data != null ){Bundle bundle = data.getExtras();bitmap = (Bitmap) bundle.get("data");}bt_take_photo.setVisibility(View.GONE);//压缩处理图片HandlerPhoto();}}
结果运行在手机上直接报错:java.lang.NullPointerException,分析日志后log发现bitmap这个变量为null,怎么会为空?!!

百思不得其解,图片明明已经保存在sd卡上,最后看了一位大神的博客,发现Android相机有这样的机制:照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图,即data里面保存的数据。但是如果自己代码指定了保存图片的uri,data里面就不会保存数据。也就是说,调用相机时指定了uri,data就没有数据,没有指定uri,data就有数据。但是这个规律也不是适用于所有的安卓手机,红米和三星部分型号在没有指定uri时,data依然没有数据。

原来如此,看来最稳妥的方式就是通过保存的图片地址获取了,修改如下:

/*** 获取拍照得到的图片*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if( requestCode == TAKE_PICTURE && resultCode == RESULT_OK ){bitmap = BitmapFactory.decodeFile(mPhotoPath);//if( data != null ){//Bundle bundle = data.getExtras();//bitmap = (Bitmap) bundle.get("data");//}bt_take_photo.setVisibility(View.GONE);//压缩处理图片HandlerPhoto();}}

这下就没问题了。




参考资料:

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

更多相关文章

  1. Android(安卓)下载图片并显示在ImageView中
  2. Android使用开源框架加载图片
  3. Android(安卓)设置圆角图片
  4. Android(安卓)Camera2.0 结合ImageReader拍照并解决图片偏转问题
  5. Android—实现自定义相机倒计时拍照
  6. drawable—hdpi、drawable—mdpi、drawable—ldpi详解
  7. android:configChanges 属性注意事项 翻转不起作用的问题
  8. android Listview 软引用SoftReference异步加载图片
  9. Android-Opengl 实现图片滤镜功能

随机推荐

  1. 详解MySql的慢查询分析及开启慢查询日志
  2. MySql登陆密码忘记及忘记密码的解决方案
  3. 解决mac使用homebrew安装MySQL无法登陆问
  4. MySQL几点重要的性能指标计算和优化方法
  5. 浅谈innodb_autoinc_lock_mode的表现形式
  6. 线上MYSQL同步报错故障处理方法总结(必看
  7. innodb_index_stats导入备份数据时报错表
  8. innodb_flush_method取值方法(实例讲解)
  9. Mysql GTID Mha配置方法
  10. MySQL PXC构建一个新节点只需IST传输的方