如何实现Android手机摄像头的的自动对焦

2024-12-16 04:54:25
推荐回答(1个)
回答1:

发现好多人都在解决一个问题那就是,如何实现android相机的自动对焦,而且是连续自动对焦的。当然直接调用系统相机就不用说了,那个很简单的。下面我们主要来看看如如何自己实现一个相机,并且实现自动连续对焦。
  根据网上的资料有如下几种:
  1 极端人物的做法: 使用一个定时器,设定定时时间,然后不间断的对焦。
  2 极客人物的做法: 那就是利用驱动层实现,但是这个一般人还是算了吧
  3 就我我这样的懒汉人物: 观察系统的原生相机得知,这东东也没用定时器啊,貌似也不可能复杂到全用驱动来实现,即使底层用的是C 实现,但是理论上讲,google肯定会提供这个封装好东东。于是果断的去查阅 DOC 一看,发现果然有这个东东 : 代码如下
  
  [java] view plaincopyprint?
  public class MainActivity extends Activity {
  
  private SurfaceView surfaceView;
  private SurfaceHolder surfaceHolder;
  private boolean flag = false;
  private String fileUrl="";
  Camera camera;
  Camera.Parameters parameters;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  
  
  setContentView(R.layout.activity_main);
  surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);
  Button button=(Button) findViewById(R.id.takepicture);
  surfaceHolder = surfaceView.getHolder();
  surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  surfaceHolder.setKeepScreenOn(true);
  surfaceView.setFocusable(true);
  surfaceView.setBackgroundColor(TRIM_MEMORY_BACKGROUND);
  surfaceHolder.addCallback(new Callback() {
  @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
  if(null==camera){
  camera=Camera.open();
  try {
  camera.setPreviewDisplay(surfaceHolder);
  initCamera();
  camera.startPreview();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  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){
  initCamera();//实现相机的参数初始化
  camera.cancelAutoFocus();//只有加上了这一句,才会自动对焦。
  }
  }
  
  });
  }
  
  });
  }
  //相机参数的初始化设置
  private void initCamera()
  {
  parameters=camera.getParameters();
  parameters.setPictureFormat(PixelFormat.JPEG);
  //parameters.setPictureSize(surfaceView.getWidth(), surfaceView.getHeight()); // 部分定制手机,无法正常识别该方法。
  parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
  parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//1连续对焦
  setDispaly(parameters,camera);
  camera.setParameters(parameters);
  camera.startPreview();
  camera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上
  
  }
  
  //控制图像的正确显示方向
  private void setDispaly(Camera.Parameters parameters,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 boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  
  return true;
  }
  
  
  
  }