Android自定义相机实现自动对焦和手动对焦:
不调用系统相机,因为不同的机器打开相机呈现的界面不统一也不能满足需求。
所以为了让程序在不同的机器上呈现出统一的界面,并且可以根据需求进行布局,做了此demo。

程序实现代码如下:

import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.lang.reflect.Method;import android.graphics.PixelFormat;import android.hardware.Camera;import android.hardware.Camera.AutoFocusCallback;import android.hardware.Camera.Parameters;import android.hardware.Camera.PictureCallback;import android.hardware.Camera.ShutterCallback;import android.os.Build;import android.os.Bundle;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.hp.classes.config.Constants;import com.hp.classes.tools.CommonUtils;import com.hp.classes.ui.BaseActivity;@SuppressWarnings("deprecation")public class PhotographActivity extends BaseActivity implements OnClickListener, SurfaceHolder.Callback {  private SurfaceView surfaceView;  private Camera camera;  private Camera.Parameters parameters;  private Button btn_goback, btn_takephoto;  private SurfaceHolder surfaceHolder;    @Override  protected void onDestroy() {    super.onDestroy();    if(camera != null){      camera.stopPreview();      camera.release();      camera = null;    }  }    @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.classes_activity_takephoto);    initView();  }  @Override  protected void onResume() {    super.onResume();    initCamera();  }  private void initView(){    btn_goback = (Button) findViewById(R.id.btn_goback);    btn_goback.setOnClickListener(this);    btn_takephoto = (Button) findViewById(R.id.btn_takephoto);    btn_takephoto.setOnClickListener(this);    surfaceView = (SurfaceView) findViewById(R.id.surfaceView);    surfaceView.setFocusable(true);    surfaceView.setOnClickListener(this);    surfaceView.setBackgroundColor(TRIM_MEMORY_BACKGROUND);    surfaceHolder = surfaceView.getHolder();    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);    surfaceHolder.setKeepScreenOn(true);    surfaceHolder.setFixedSize(400, 300);    surfaceHolder.addCallback(this);  }  @Override  public void surfaceDestroyed(SurfaceHolder holder) {    // TODO Auto-generated method stub    camera.stopPreview();    camera.release();    camera = null;  }  @Override  public void surfaceCreated(SurfaceHolder holder) {    // TODO Auto-generated method stub    try {      camera.setPreviewDisplay(surfaceHolder);    } catch (IOException e) {      e.printStackTrace();    }  }  @Override  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    // 实现自动对焦    camera.autoFocus(new AutoFocusCallback() {      @Override      public void onAutoFocus(boolean success, Camera camera) {        if (success) {          camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦          doAutoFocus();        }      }    });  }  // 相机参数的初始化设置  private void initCamera() {    if (null == camera) {      camera = Camera.open();    }    parameters = camera.getParameters();    parameters.setPictureFormat(PixelFormat.JPEG);    parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);    if (!Build.MODEL.equals("KORIDY H30")) {      parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦    }else{      parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);    }    camera.setParameters(parameters);    setDispaly(camera);    camera.startPreview();    camera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上  }  // 控制图像的正确显示方向  private void setDispaly(Camera camera) {    if (Integer.parseInt(Build.VERSION.SDK) >= 8) {      setDisplayOrientation(camera, -90);    } else {      parameters.setRotation(-90);    }  }  // 实现的图像的正确显示  private void setDisplayOrientation(Camera camera, int i) {    Method downPolymorphic;    try {      downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });      if (downPolymorphic != null) {        downPolymorphic.invoke(camera, new Object[] { i });      }    } catch (Exception e) {      Log.e("Came_e", "图像出错");    }  }  @Override  public void onClick(View v) {    switch (v.getId()) {    case R.id.surfaceView:      doAutoFocus();      break;    case R.id.btn_takephoto:      takePicture();      break;    case R.id.btn_goback:      finish();      break;    default:      break;    }  }  // handle button auto focus  private void doAutoFocus() {    parameters = camera.getParameters();    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);    camera.setParameters(parameters);    camera.autoFocus(new AutoFocusCallback() {      @Override      public void onAutoFocus(boolean success, Camera camera) {        if (success) {          camera.cancelAutoFocus();// 只有加上了这一句,才会自动对焦。          if (!Build.MODEL.equals("KORIDY H30")) {            parameters = camera.getParameters();            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 1连续对焦            camera.setParameters(parameters);          }else{            parameters = camera.getParameters();            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);            camera.setParameters(parameters);          }        }      }    });  }  private void takePicture() {    camera.takePicture(shutterCallback, rawCallback, jpegCallback);  }  // define shutterCallback  ShutterCallback shutterCallback = new ShutterCallback() {    public void onShutter() {      // TODO Do something when the shutter closes.    }  };  PictureCallback rawCallback = new PictureCallback() {    public void onPictureTaken(byte[] data, Camera camera) {      // TODO Do something with the image RAW data.    }  };  // stroe the picture in format jpeg  PictureCallback jpegCallback = new PictureCallback() {    public void onPictureTaken(byte[] data, Camera camera) {      // Save the image JPEG data to the SD card      FileOutputStream outStream = null;      try {        //修改图片路径和名称        String tempFilename = String.valueOf(System.currentTimeMillis()) + ".jpg";        File folder = Constants.CACHE_FOLDER;        if (!folder.isDirectory()) {          folder.mkdirs();        }        String path = Constants.CACHE_FOLDER + File.separator + tempFilename;        outStream = new FileOutputStream(path);        outStream.write(data);        outStream.flush();        outStream.close();        surfaceView.setBackgroundDrawable(new BitmapDrawable(BitmapFactory.decodeByteArray(data, 0, data.length)));      } catch (FileNotFoundException e) {        Log.e("TAG", "File Note Found", e);      } catch (IOException e) {        Log.e("TAG", "IO Exception", e);      }    }  };}

classes_activity_takephoto.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>              

在清单文件需要添加相应权限:

      

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多相关文章

  1. Android(安卓)相册回传 相机 (更换头像效果)
  2. Android(安卓)Camera2 之 CameraCharacteristics 详解
  3. android 图片下载方法总结
  4. Android(安卓)调用 startActivityForResult(intent,requestCode)
  5. 图像库 libpng 编译与实践
  6. openCv CameraBridgeViewBase 竖屏显示对应的修改
  7. Android开发技巧——Camera拍照功能
  8. Android调用系统相册和相机选择图片并显示在imageview中
  9. Android相机、相册获取图片,解决相机拍照图片被压缩模糊的情况

随机推荐

  1. sdk manage 更新与安装
  2. Android 设立全屏
  3. 在android中举例说明如何用WebView.loadU
  4. Android中OnScrollListener回调具体剖析
  5. android -------- 获取手机设备信息
  6. Android JSON数据的解析与封装小Demo
  7. android ping
  8. Android 通过按钮弹出菜单(通过Button显示
  9. Android热修复--腾讯bugly
  10. Python+appium 实现 Android 自动化