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

来源:互联网 发布:java怎么发音 编辑:程序博客网 时间:2024/05/16 01:42

不废话,直接上代码

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";@Overrideprotected 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

0 0