博客源址android 调用系统相机拍照 获取原图

博客时间2013-04-23 11:08   

好吧,为了这个问题又折腾了一整天。之前在网上找来的方法,如果在onActivityResult中直接用data.getData()的方式来生成bitmap,其实获取的是拍照生成的缩略图!看看尺寸就知道了。如果要获取原图,还需要一番折腾(特别是对于手里这个Samsung i9000)——之前朋友在不同的机型上使用的方法在我这里一直报错,且属于那种uncaught的错误-.-  话说回来,具体的折腾方法如下(如果不幸你看到了,希望不要“折疼了”):  在拍照的出发按钮的点击事件中写入如下代码:  toCam.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  //先验证手机是否有sdcard  String status=Environment.getExternalStorageState();  if(status.equals(Environment.MEDIA_MOUNTED))  try {  File dir=new File(Environment.getExternalStorageDirectory() + "/"+localTempImgDir);  if(!dir.exists())dir.mkdirs(); 
Intent intent=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);  File f=new File(dir, localTempImgFileName);//localTempImgDir和localTempImageFileName是自己定义的名字  Uri u=Uri.fromFile(f);  intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);  intent.putExtra(MediaStore.EXTRA_OUTPUT, u);  startActivityForResult(intent, GET_IMAGE_VIA_CAMERA);  } catch (ActivityNotFoundException  e) {  // TODO Auto-generated catch block  Toast.makeText(ImpromptuActivity.this, "没有找到储存目录",Toast.LENGTH_LONG).show();   }else{  Toast.makeText(ImpromptuActivity.this, "没有储存卡",Toast.LENGTH_LONG).show();  dialog.dismiss();  }); 
在onActivityResult中这样折腾:  @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {  if(resultCode==RESULT_OK )  switch(requestCode)  case GET_IMAGE_VIA_CAMERA:  File f=new File(Environment.getExternalStorageDirectory()  +"/"+localTempImgDir+"/"+localTempImgFileName);  try {     Uri u =     Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(),     f.getAbsolutePath(), null, null));     //u就是拍摄获得的原始图片的uri,剩下的你想干神马坏事请便……  } catch (FileNotFoundException e) {     // TODO Auto-generated catch block     e.printStackTrace();  break;  super.onActivityResult(requestCode, resultCode, data); 
别高兴太早了,还有关键问题:  上面的代码只要你会用google,一般都能找来拼凑一番。但是,仅仅是这样,你还会得到未知错误……Samsung的系统相机,版式是横板的,如果你的activity恰巧是竖版的,那么获取这个回调uri的时候,很可能为空!  原因在于,如果你没有设置版式改变的时候,activity不要调用onCreate方法!这就是要命的地方!  设置方法其实很简单:  1、在Manfest.xml中,给activity添加一个属性:android:configChanges="orientation|keyboardHidden"  2、在activity中添加:  @Override      public void onConfigurationChanged(Configuration config) {      super.onConfigurationChanged(config);      }  另外还有一个蛋疼的错误容易犯:千万别给这个activity添加单例模式,即:android:launchMode="singleInstance"
好了,完成这些,你就终于可以不“折疼”了! good luck!

照相得到的图片,最好自己指定路径,这样返回数据时,就不用从Intent中获取了,我们知道是什么路径,可以直接去拿。


更多相关文章

  1. Android事件分发机制完全解析,带你从源码的角度彻底理解(下) 。
  2. 【Android(安卓)对话框(Dialog)大全 建立你自己的对话框】
  3. android studio生成签名导打包的方法
  4. Android(安卓)8.0 拨号流程分析
  5. AsyncTask的使用及源码分析
  6. android graphics下的Paint类,Path类,Canvas类
  7. Android消息机制及HandlerThread、Handler内存泄漏问题
  8. Android事件传递机制(更加深入的了解事件的触发过程)
  9. android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理 (1)

随机推荐

  1. 充分利用 Java 的元数据,第 3 部分:高级处
  2. java 的 数据库连接测试类 (SQL server)
  3. 在java自动生成hashCode代码问题? 请大神
  4. 手动配置springMVC4的方法
  5. Android 多线程下载文件原理霸气解析介绍
  6. Jsp以get方式提交中文及特殊字符,javascri
  7. javascript实现设置select下拉列表框中选
  8. [零基础学JAVA]Java SE面向对象部分.面向
  9. Android Asyntask:对上下文使用弱引用以避
  10. Java8 新特性之流式数据处理