简单拍照的实现
public class Main extends Activity implements SurfaceHolder.Callback,// 界面改变接口AutoFocusCallback, // 自动对焦接口PictureCallback // 处理照片回调接口{private static final String TAG = "TakeActivity";private SurfaceView surfaceView;private Camera camera;private boolean isboolean;int w, h;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Window window = getWindow();requestWindowFeature(Window.FEATURE_NO_TITLE);// 没有标题window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// 没有信息栏window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 高亮setContentView(R.layout.main);WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);Display display = wm.getDefaultDisplay();w = display.getWidth();h = display.getHeight();System.out.println("宽高=" + w + "*" + h);surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);// 分辨率的设置为固定的值:176*144,320*240,352*288,480*360,640*480surfaceView.getHolder().setFixedSize(320, 240); // 设置分辨率/* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 必须设置,虽然已经过时了surfaceView.getHolder().addCallback(this);// 回调}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (camera != null && event.getRepeatCount() == 0) {switch (keyCode) {case KeyEvent.KEYCODE_SEARCH:// 按下搜索键,拍照camera.autoFocus(null);// 自动对焦,必须放在startPreview()和stopPreview()之间// 开始拍照camera.takePicture(null,// 拍照瞬间调用null, // 获得没有压缩过的图片数据this// 返回处理后的图片数据);// 通过handler异步实现拍照break;}}return true;// 注意这边没有将事件继续往下传递}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// 在界面尺寸改变时被调用,设置相机的参数(大小,格式)Camera.Parameters param = camera.getParameters();param.setPreviewFrameRate(3);// 每秒3帧,每秒从摄像头中取3帧画面param.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式param.set("jpeg-quality", 85);// 照片质量/* 参数不要设置,否则报错,不知道什么原因,不设置将采用默认值 */// param.setPreviewSize(h, w);// 设置预览照片的大小// param.setPictureSize(h, w);// 设置照片的大小为手机的屏幕camera.setParameters(param);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// 界面创建时被调用,一般是用来,打开相机,设置预览try {camera = Camera.open();// 不能放在构造函数里,否则产生不了预览效果camera.setPreviewDisplay(surfaceView.getHolder());// 通过SurfaceView显示取景画面camera.startPreview();// 开始预览isboolean = true;} catch (IOException e) {Log.e(TAG, e.toString());}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubif (camera != null) {if (isboolean) {camera.stopPreview();// 关闭预览camera.release();// 释放相机}}}// 创建位图,并保存到sd卡,以系统时间作为文件名@Overridepublic void onPictureTaken(byte[] data, Camera camera) {// TODO Auto-generated method stubtry {Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);String path = Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator + "mobileoa" + File.separator + "photo";File file = new File(path, System.currentTimeMillis() + ".jpg");// 保存到sd卡FileOutputStream outStream = new FileOutputStream(file);bitmap.compress(CompressFormat.JPEG, 100, outStream);outStream.close();camera.stopPreview();camera.startPreview();// 开始预览} catch (Exception e) {Log.e(TAG, e.toString());}}// 自动对焦@Overridepublic void onAutoFocus(boolean success, Camera camera) {// TODO Auto-generated method stub}public boolean onTouchEvent(MotionEvent event) {if (camera != null) {camera.takePicture(null, null, this);}return true;}}?