Android中的拍照常用的有两种:
- 拍照获取缩略图
private static final int ACTION_TAKE_PHOTO_S = 2;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, ACTION_TAKE_PHOTO_S);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==ACTION_TAKE_PHOTO_S&&resultCode==RESULT_OK){
Bundle extras = data.getExtras();
mImageBitmap = (Bitmap) extras.get("data");
mImageView.setImageBitmap(mImageBitmap);
}
}
- 拍照获取原图
private static final int ACTION_TAKE_PHOTO_B = 1;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//TODO f是拍照后照片保存的文件
File f = null;
//TODO 保存文件名,拍照完成后获取图片要用到
mCurrentPhotoPath = f.getAbsolutePath();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(f));
startActivityForResult(takePictureIntent, ACTION_TAKE_PHOTO_B );
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==ACTION_TAKE_PHOTO_S&&resultCode==RESULT_OK){
//TODO 到这里拍摄的图片已经保存到指定的文件中了
}
}
对于图片的缩放,可以参考
http://blog.csdn.net/guchuanhang/article/details/43835585
- 对拍照逻辑的封装
package com.example.android.photobyintent;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;
@TargetApi(Build.VERSION_CODES.ECLAIR)
public class CameraUtil {
private static final String JPEG_FILE_PREFIX = "IMG_";
private static final String JPEG_FILE_SUFFIX = ".jpg";
private static final String CAMERA_DIR = "/dcim/";
/**该方法需要在onActivityResult进行处理
* @return filePath
*/
public static String takePictureIntent(Context packageContext,
int requestCode) {
String imgFilePath = null;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(packageContext
.getPackageManager()) == null) {
Toast.makeText(packageContext, "抱歉您没有相机APP,无法拍照~",
Toast.LENGTH_LONG).show();
} else {
File f = null;
try {
f = setUpPhotoFile(packageContext);
imgFilePath = f.getAbsolutePath();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(f));
} catch (IOException e) {
e.printStackTrace();
f = null;
}
((Activity) packageContext).startActivityForResult(
takePictureIntent, requestCode);
}
return imgFilePath;
}
@TargetApi(Build.VERSION_CODES.FROYO)
private static File setUpPhotoFile(Context context) throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA)
.format(new Date());
String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_";
File albumF = null;
if (Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageState())) {
String albumName = context.getString(R.string.app_name);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
albumF = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
albumName);
} else {
albumF = new File(Environment.getExternalStorageDirectory()
+ CAMERA_DIR + albumName);
}
if (albumF != null) {
if (!albumF.mkdirs()) {
if (!albumF.exists()) {
Log.d("CameraSample", "failed to create directory");
return null;
}
}
}
} else {
Log.v(context.getString(R.string.app_name),
"External storage is not mounted READ/WRITE.");
}
File imageF = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX,
albumF);
return imageF;
}
/**
将图片加入图库
*/
public static void img2Galley(Context context, String imgPath) {
Intent mediaScanIntent = new Intent(
"android.intent.action.MEDIA_SCANNER_SCAN_FILE");
File f = new File(imgPath);
if (f != null) {
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
context.sendBroadcast(mediaScanIntent);
}
}
@TargetApi(Build.VERSION_CODES.ECLAIR)
public static Bitmap getThumbnail(String filePath) {
Bitmap thumbBitmap = null;
ExifInterface exif;
try {
exif = new ExifInterface(filePath);
byte[] imageData = exif.getThumbnail();
thumbBitmap = BitmapFactory.decodeByteArray(imageData, 0,
imageData.length);
} catch (IOException e) {
e.printStackTrace();
}
return thumbBitmap;
}
}
封装的这个工具类中,takePictureIntent调用相机拍照,保存原图并返回图片路径。需要在页面的onActivityResult调用 CameraUtil.img2Galley(this, filePath);将图片添加到图库中。
最后需要在Manifest中添加如下参数。
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
本文主要参考地址:
http://developer.android.com/training/camera/photobasics.html#TaskScalePhoto
Demo下载地址:
http://download.csdn.net/detail/guchuanhang/9500418