Android中调用摄像头并实现对焦拍照

不废话,直接上代码

package com.kelly.takepicture;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {

	private View butlayout;
	private SurfaceView surfaceView;
	private Camera camera;
	private File jpgFile;
	private Camera.Parameters parameters;
	private static final String TAG = "MainActivity";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 设置全屏显示
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);

		setContentView(R.layout.activity_main);

		surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
		surfaceView.getHolder().setSizeFromLayout();
		surfaceView.getHolder().setKeepScreenOn(true);
		surfaceView.getHolder().addCallback(new SurfaceCallback());

		butlayout = findViewById(R.id.buttonlayout);
	}

	// 点击屏幕时,对焦和拍照按钮 出现
	public boolean onTouchEvent(MotionEvent event) {

		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			butlayout.setVisibility(ViewGroup.VISIBLE);
			return true;
		}

		return super.onTouchEvent(event);
	}

	private class SurfaceCallback implements Callback {

		@SuppressLint("InlinedApi")
		public void surfaceCreated(SurfaceHolder holder) {

			if (camera == null) {
				camera = Camera.open();// 打开摄像头

				try {

					camera.setPreviewDisplay(holder);
					initCamera();
					camera.startPreview();

					// camera.setDisplayOrientation(90);
					// parameters.set("rotation", 90);

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}

		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {

			// 实现自动对焦
			camera.autoFocus(new AutoFocusCallback() {

				public void onAutoFocus(boolean success, Camera camera) {
					if (success) {
						initCamera();// 实现相机的参数初始化
						camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。
					}
				}

			});
		}

		public void surfaceDestroyed(SurfaceHolder holder) {

			if (camera != null) {
				camera.stopPreview();
				camera.release();
				camera = null;
			}
		}

	}

	public void takepicture(View view) {
		switch (view.getId()) {
		// 拍照
		case R.id.but_takepic:

			camera.takePicture(null, null, new MyPictureCallback());

			break;
		case R.id.but_autofocus:
			// 对焦
			camera.autoFocus(null);

			break;

		default:
			break;
		}

	}

	private class MyPictureCallback implements PictureCallback {

		public void onPictureTaken(byte[] data, Camera camera) {

			// 保存 图片
			new SavePictureTask().execute(data);
			camera.startPreview();
		}

	}

	/**
	 * 使用异步任务 进行文件操作
	 * 
	 * @author Administrator
	 * 
	 */
	class SavePictureTask extends AsyncTask<byte[], String, String> {

		protected String doInBackground(byte[]... params) {
			String fname = DateFormat.format("yyyyMMddhhmmss", new Date())
					.toString() + ".jpg";
			jpgFile = new File(Environment.getExternalStorageDirectory() + "/"
					+ fname);
			try {
				FileOutputStream fos = new FileOutputStream(jpgFile.getPath());
				fos.write(params[0]);
				fos.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			return null;
		}
	}

	// 相机参数的初始化设置
	@SuppressLint("InlinedApi")
	private void initCamera() {
		parameters = camera.getParameters();
		Log.i(TAG, parameters.flatten());
		parameters.setJpegThumbnailQuality(100);// 设置质量
		// parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);//闪光灯
		parameters
				.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦

		// 下面两句调整照片质量,只针对小米2S,不同手机,参数不同
		// parameters.setPreviewSize(1920, 1088);
		// parameters.setPictureSize(4208, 3120);

		setDispaly(parameters, camera);
		camera.setParameters(parameters);

		camera.startPreview();
		camera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上

	}

	// 控制图像的正确显示方向
	@SuppressWarnings("deprecation")
	private void setDispaly(Camera.Parameters parameters, Camera camera) {
		if (Integer.parseInt(Build.VERSION.SDK) >= 8) {
			camera.setDisplayOrientation(90);
		} else {
			parameters.setRotation(90);
		}

	}

}
源码下载: 点击打开链接

参考:http://blog.csdn.net/geekstart/article/details/13630009

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值