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

转自:http://handroid.diandian.com/post/2011-10-02/5467819

好吧,为了这个问题又折腾了一整天。之前在网上找来的方法,如果在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!
调用系统相机拍摄照片后,可以通过以下步骤获取照片的Uri: 1. 在调用相机时,使用`startActivityForResult()`方法启动相机,并传递一个请求码,例如: ``` Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); ``` 2. 在`onActivityResult()`方法中获取相机返回的数据,包括照片的缩略和Uri: ``` protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); Uri photoUri = data.getData(); // 处理照片 } } ``` 如果需要直接获取照片的Uri,可以通过以下步骤: ``` protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Uri photoUri = data.getData(); if (photoUri == null) { // 如果返回的Uri为null,则通过Intent中的extras获取照片数据,并将其保存到指定路径中 Bitmap imageBitmap = (Bitmap) data.getExtras().get("data"); photoUri = saveImage(imageBitmap); } // 处理照片 } } private Uri saveImage(Bitmap imageBitmap) { // 将照片保存到指定路径,并返回其Uri File imageFile = new File(getExternalFilesDir(null), "photo.jpg"); try (OutputStream os = new FileOutputStream(imageFile)) { imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, os); } catch (IOException e) { e.printStackTrace(); } return Uri.fromFile(imageFile); } ``` 在上述代码中,如果返回的Uri为null,则通过Intent中的extras获取照片数据,并将其保存到指定路径中,然后返回该路径对应的Uri。注意,这种方式获取的是照片的缩略,如果需要获取原始照片,可以通过保存照片到指定路径的方式来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值