herozhou1314 / android 技术... / 调用系统相机拍照,获取原始图

分享

   

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

2012-04-25  herozhou1...
标签拍照  相机  分类: 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!




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>