zoukankan      html  css  js  c++  java
  • android 调用系统相机拍照 获取原图

    好吧,为了这个问题又折腾了一整天。之前在网上找来的方法,如果在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!
  • 相关阅读:
    vector的erase函数
    结构体定义容易混淆的地方
    JavaScript重点知识
    JS中预解析案例分析
    浏览器console控制台不显示编译错误/警告
    强烈推荐一款强大的公式编辑器软件AxMath
    DIV+CSS布局
    CSS-常见属性
    CSS-定义样式表
    CSS-使用CSS样式的方式
  • 原文地址:https://www.cnblogs.com/xgjblog/p/4201734.html
Copyright © 2011-2022 走看看