android 调用系统相机拍照 获取原图

3 篇文章 0 订阅
2 篇文章 0 订阅
好吧,为了这个问题又折腾了一整天。之前在网上找来的方法,如果在onActivityResult中直接用data.getData()的方式来生成bitmap,其实获取的是拍照生成的缩略图!看看尺寸就知道了。如果要获取原图,还需要一番折腾(特别是对于手里这个Samsung i9000)——之前朋友在不同的机型上使用的方法在我这里一直报错,且属于那种uncaught的错误-.- 
话说回来,具体的折腾方法如下(如果不幸你看到了,希望不要“折疼了”): 
在拍照的出发按钮的点击事件中写入如下代码: 
toCam.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

            //localTempImgDir和localTempImageFileName以及localTempFileNameSave是自己定义的名字 
            localTempFileName = "MyImgTest_" + java.lang.System.currentTimeMillis()+".jpg";        
            localTempFileNameSave = localTempFileName;
            //先验证手机是否有sdcard
            String status = Environment.getExternalStorageState();
            if(status.equals(Environment.MEDIA_MOUNTED)){
                String dirStr = Environment.getExternalStorageDirectory() + "/" + localTempImgDir;
                File dir = new File(dirStr);
                
                if(!dir.exists()){
                   dir.mkdir(); 
                }
                
                Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

                //这样调用系统照相机拍的图片大小只有系统原照相照的七分之一大小左右
                File f = new File(dir, localTempFileName);
                Uri u = Uri.fromFile(f);
                intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, u);
                startActivityForResult(intent, GET_IMAGE_VIA_CAMERA);
                
            }

    }

}); 

在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!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值