欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-01 20:20:40
如何实现android相机的自动对焦,而且是连续自动对焦的。当然直接调用系统相机就不用说了,那个很简单的。下面我们主要来看看如如何自己实现一个相机,并且实现自动连续对焦。...

如何实现android相机的自动对焦,而且是连续自动对焦的。当然直接调用系统相机就不用说了,那个很简单的。下面我们主要来看看如如何自己实现一个相机,并且实现自动连续对焦。

代码如下:

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;
  }
  
 
 
}

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