一、调用相机拍照
1、启动相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, TAKE_PHOTO_WITH_DATA);
2、在onActivityResult中获取返回数据
Bitmap photo = data.getParcelableExtra("data");
二、裁剪处理
调用时机:启动相机拍完照后,再调用裁剪处理。
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setType("image/*");
intent.putExtra("data", data);
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 128);
intent.putExtra("outputY", 128);
intent.putExtra("return-data", true);
startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);
三、调用相机返回原图
调用相机拍照返回的是拍照生成的缩略图,如果要获取原图,还需要一番折腾。其原理是:启动相机拍照后,将图片保存在指定路径,然后再onActivityResult()中再获取图片即可。
当然了,需要验证手机是否有SD卡~~
<pre name="code" class="java">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) {
Toast.makeText(ImpromptuActivity.this, "没有找到储存目录",Toast.LENGTH_LONG).show();
}
}else{
Toast.makeText(ImpromptuActivity.this, "没有储存卡",Toast.LENGTH_LONG).show();
}
}<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
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) {
e.printStackTrace();
}
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
大头戏来了
转自:http://www.cnblogs.com/jun-it/articles/2881826.html#commentform
一、裁剪图片的Intent附件参数的具体意义
看下三个极为重要的选项:data、MediaStore.EXTRA_OUTPUT以及return-data。
二、原理介绍。
data和MediaStore.EXTRA_OUTPUT都是可选的传入数据选项,你可以设置data为Bitmap,或者将相应的数据与URI关联起来,你也可选择是否返回数据(return-data)。
常见用法:
1)使用Bitmap并返还数据。return-data设为true,你将获得一个与内部数据关联的action,并且bitmap以此方法返回:extras.getParcelabel("data")。如果你最终要获取的图片比较大,那么不建议用此方法。
Bundle myExtras = getIntent().getExtras();
if (myExtras != null && (myExtras.getParcelable("data") != null || myExtras.getBoolean("return-data")))
{
Bundle extras = new Bundle();
extras.putParcelable("data", croppedImage);
setResult(RESULT_OK,(new Intent()).setAction("inline-data").putExtras(extras));
finish();
}
2)使用URI返回数据。return-data为false,那么在onActivityResult()中你将不会接收到任何Bitmap,你需要将MediaStore.EXTRA_OUTPUT关联到一个Uri,此Uri是用来存放Bitmap的。但是有些条件,首先你需要一个短暂的与此uri相关联的文件地址,当然这不是个大问题(除非是那些没有sdcard的设备)。
if (mSaveUri != null) {
OutputStream outputStream = null;
try {
outputStream = mContentResolver.openOutputStream(mSaveUri);
if (outputStream != null) {
croppedImage.compress(mOutputFormat, 75, outputStream);
}
} catch (IOException ex) {
// TODO: report error to caller
Log.e(TAG, "Cannot open file: " + mSaveUri, ex);
} finally {
Util.closeSilently(outputStream);
}
Bundle extras = new Bundle();
setResult(RESULT_OK, new Intent(mSaveUri.toString()).putExtras(extras));
}
简而言之,截大图用URI,小图用Bitmap。
三、相册截图
1、从相册截大图
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 2);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 600);
intent.putExtra("outputY", 300);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, CHOOSE_BIG_PICTURE);
2、从相册截小图
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 2);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 100);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, CHOOSE_SMALL_PICTURE);
3、onActivityResult()处理返回的数据
switch (requestCode) {
case CHOOSE_BIG_PICTURE:
Log.d(TAG, "CHOOSE_BIG_PICTURE: data = " + data);//it seems to be null
if(imageUri != null){
Bitmap bitmap = decodeUriAsBitmap(imageUri);//decode bitmap
imageView.setImageBitmap(bitmap);
}
break;
case CHOOSE_SMALL_PICTURE:
if(data != null){
Bitmap bitmap = data.getParcelableExtra("data");
imageView.setImageBitmap(bitmap);
}else{
Log.e(TAG, "CHOOSE_SMALL_PICTURE: data = " + data);
}
break;
default:
break;
}
private Bitmap decodeUriAsBitmap(Uri uri){
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return bitmap;
}
四、拍照截图
1、