android 调用系统相机拍照 获取原图
16lz
2021-01-25
博客源址: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中获取了,我们知道是什么路径,可以直接去拿。
更多相关文章
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下) 。
- 【Android(安卓)对话框(Dialog)大全 建立你自己的对话框】
- android studio生成签名导打包的方法
- Android(安卓)8.0 拨号流程分析
- AsyncTask的使用及源码分析
- android graphics下的Paint类,Path类,Canvas类
- Android消息机制及HandlerThread、Handler内存泄漏问题
- Android事件传递机制(更加深入的了解事件的触发过程)
- android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理 (1)