如何實現Android手機攝像頭的的自動對焦

jopen 10年前發布 | 42K 次閱讀 Android Android開發 移動開發

       發現好多人都在解決一個問題那就是,如何實現android相機的自動對焦,而且是連續自動對焦的。當然直接調用系統相機就不用說了,那個很簡單的。下面我們主要來看看如如何自己實現一個相機,并且實現自動連續對焦。

     根據網上的資料有如下幾種:

        1 極端人物的做法:  使用一個定時器,設定定時時間,然后不間斷的對焦。

        2  極客人物的做法:  那就是利用驅動層實現,但是這個一般人還是算了吧

        3  就我我這樣的懶漢人物: 觀察系統的原生相機得知,這東東也沒用定時器啊,貌似也不可能復雜到全用驅動來實現,即使底層用的是C 實現,但是理論上講,google肯定會提供這個封裝好東東。于是果斷的去查閱 DOC  一看,發現果然有這個東東  : 代碼如下

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



}

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!