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

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

     根据网上的资料有如下几种:

        1 极端人物的做法:  使用一个定时器,设定定时时间,然后不间断的对焦。

        2  极客人物的做法:  那就是利用驱动层实现,但是这个一般人还是算了吧

        3  就我我这样的懒汉人物: 观察系统的原生相机得知,这东东也没用定时器啊,貌似也不可能复杂到全用驱动来实现,即使底层用的是C 实现,但是理论上讲,google肯定会提供这个封装好东东。于是果断的去查阅 DOC  一看,发现果然有这个东东  : 代码如下

   

[java]  view plain  copy
 print ?
  1. <strong><span style="font-size:18px">public class MainActivity extends Activity {  
  2.   
  3.     private SurfaceView surfaceView;  
  4.     private SurfaceHolder surfaceHolder;  
  5.     private boolean flag = false;  
  6.     private String fileUrl="";  
  7.     Camera camera;  
  8.     Camera.Parameters parameters;  
  9.       
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.       
  14.   
  15.       setContentView(R.layout.activity_main);  
  16.       surfaceView =  (SurfaceView) findViewById(R.id.surfaceView1);  
  17.       Button  button=(Button) findViewById(R.id.takepicture);  
  18.       surfaceHolder =  surfaceView.getHolder();  
  19.       surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  20.       surfaceHolder.setKeepScreenOn(true);  
  21.       surfaceView.setFocusable(true);  
  22.       surfaceView.setBackgroundColor(TRIM_MEMORY_BACKGROUND);  
  23.       surfaceHolder.addCallback(new Callback() {  
  24.       @Override  
  25.         public void surfaceDestroyed(SurfaceHolder holder) {  
  26.             // TODO Auto-generated method stub  
  27.              camera.stopPreview();  
  28.              camera.release();  
  29.              camera=null;  
  30.               
  31.         }  
  32.               
  33.         @Override  
  34.         public void surfaceCreated(SurfaceHolder holder) {  
  35.             // TODO Auto-generated method stub  
  36.             if(null==camera){  
  37.                 camera=Camera.open();  
  38.             try {  
  39.                       camera.setPreviewDisplay(surfaceHolder);  
  40.                       initCamera();  
  41.                       camera.startPreview();  
  42.                 } catch (IOException e) {  
  43.                     // TODO Auto-generated catch block  
  44.                     e.printStackTrace();  
  45.                 }  
  46.           }  
  47.               
  48.         }  
  49.               
  50.         @Override  
  51.         public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){  
  52.             //实现自动对焦  
  53.             camera.autoFocus(new AutoFocusCallback() {  
  54.                 @Override  
  55.                 public void onAutoFocus(boolean success, Camera camera) {  
  56.                     if(success){  
  57.                         initCamera();//实现相机的参数初始化  
  58.                         camera.cancelAutoFocus();//只有加上了这一句,才会自动对焦。  
  59.                     }  
  60.                 }  
  61.   
  62.             });  
  63.          }  
  64.   
  65.     });  
  66.   }  
  67.       //相机参数的初始化设置  
  68.       private void initCamera()  
  69.         {  
  70.             parameters=camera.getParameters();  
  71.             parameters.setPictureFormat(PixelFormat.JPEG);  
  72.             //parameters.setPictureSize(surfaceView.getWidth(), surfaceView.getHeight());  // 部分定制手机,无法正常识别该方法。  
  73.             parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);     
  74.             parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);//1连续对焦  
  75.             setDispaly(parameters,camera);  
  76.             camera.setParameters(parameters);  
  77.             camera.startPreview();  
  78.             camera.cancelAutoFocus();// 2如果要实现连续的自动对焦,这一句必须加上  
  79.               
  80.         }  
  81.         
  82.       //控制图像的正确显示方向  
  83.       private void setDispaly(Camera.Parameters parameters,Camera camera)  
  84.       {  
  85.           if (Integer.parseInt(Build.VERSION.SDK) >= 8){  
  86.                 setDisplayOrientation(camera,90);  
  87.             }  
  88.         else{  
  89.                 parameters.setRotation(90);  
  90.             }  
  91.             
  92.       }       
  93.       
  94.       //实现的图像的正确显示  
  95.       private void setDisplayOrientation(Camera camera, int i) {  
  96.           Method downPolymorphic;  
  97.          try{  
  98.                 downPolymorphic=camera.getClass().getMethod("setDisplayOrientation"new Class[]{int.class});  
  99.                 if(downPolymorphic!=null) {  
  100.                     downPolymorphic.invoke(camera, new Object[]{i});  
  101.                 }  
  102.             }  
  103.             catch(Exception e){  
  104.                 Log.e("Came_e""图像出错");  
  105.             }  
  106.       }  
  107.      
  108.   
  109.     @Override  
  110.     public boolean onCreateOptionsMenu(Menu menu) {  
  111.         // Inflate the menu; this adds items to the action bar if it is present.  
  112.         getMenuInflater().inflate(R.menu.main, menu);  
  113.           
  114.         return true;  
  115.     }  
  116.       
  117.      
  118.      
  119. }</span></strong>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值