2012-10-12 345 views
8

Voy a configurar mi aplicación de Android abriendo la cámara y activando el enfoque manual tocando el punto en la cámara. La cámara puede volver a enfocar al punto donde he apuntado a la pantalla. ¿Podría decirme la metodología o qué componente debería empezar a modificar?Configuración de Android enfoque manual tocando

A continuación es mi código:

public void takePhoto(File photoFile, String workerName, int width, int height, int quality) { 
    if (getAutoFocusStatus()){ 
     camera.autoFocus(new AutoFocusCallback() { 
      @Override 
      public void onAutoFocus(boolean success, Camera camera) { 
       camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
      } 
     }); 
    }else{ 
     camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
    } 

this.photoFile = photoFile; 
this.workerName = workerName; 
this.imageOutputWidth = width; 
this.imageOutputHeight = height; 
} 

public void takePhoto(File photoFile, int width, int height, int quality) { 
takePhoto(photoFile, null, width, height, quality); 
} 
+0

Creo que lo que quiere se llama _assisted_ focus. http://en.wikipedia.org/wiki/Manual_focus, enfoque manual es imposible: http://android.stackexchange.com/questions/2042/can-i-manually-focus-the-camera-on-my-android -phone (desde hace unos años) – Annan

Respuesta

11

Aunque esta respuesta no muestra cómo enfocarse en una sola área, definitivamente es útil para mostrar cómo exactamente enfocar la cámara para empezar.

Esto es lo que he hecho. Esto funciona en mi dispositivo (ADN Droid por HTC), construida en Android Studio

En tanto OnSurfaceChanged() y OnSurfaceCreated(), tengo el siguiente código: (mCamera es mi privado Camera objeto)

 mCamera.stopPreview(); 
     Camera.Parameters p = mCamera.getParameters(); 
     p.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 

     mCamera.setParameters(p); 
     mCamera.setPreviewDisplay(surfaceHolder); 
     mCamera.startPreview(); 
     mCamera.autoFocus(null); 

En el constructor, debe colocar

 setFocusable(true); 
     setFocusableInTouchMode(true); 

Esto le permitirá recibir eventos de enfoque. En cuanto a capturarlos ...

public boolean onTouchEvent(MotionEvent event){ 
    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
     Log.d("down", "focusing now"); 

     mCamera.autoFocus(null); 
    } 

    return true; 
} 
+1

IMO esta respuesta no resuelve la pregunta, simplemente establece el enfoque automático (nulo). No enfoca la cámara en el punto seleccionado – Hugo

+0

Tiene razón. Además de eso, esta API de cámara ahora está privada de API 21 http://developer.android.com/reference/android/hardware/Camera.html – Nlinscott

+0

que no funciona en htc one –

0

La clave aquí es llamar camera.autoFocus (autoFocusCallBack) y después de nos centramos método autofocusCallback.onAutoFocus (éxito booleano, cámara cámara) se llama - llamar al camera.takePicture (obturador Camera.ShutterCallback, Camera.PictureCallback rAW, JPEG Camera.PictureCallback)

Ver más: http://achorniy.wordpress.com/2009/12/29/how-to-use-autofocus-in-android/

o

En la superficie cambiado y antes vista previa, puede utilizar la opción de enfoque automático que establecerá la distancia focal de forma automática, a continuación, iniciar la vista previa, y luego automática- centrarse en lo que se muestra ...

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

// Set camera properties first 
Camera.Parameters parameters = camera.getParameters(); 
     parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
     camera.setParameters(parameters); 

camera.startPreview(); 

camera.autoFocus(null); 

} 

de crédito: where to put autofocus in the class android camera

+0

Entonces, si agrego el evento arg para tocar la pantalla y luego llamo al AutoFocus otra vez y eso resuelve mi problema? –

1

¿Ha intentado usar setFocusAreas() para establecer el área de enfoque donde el usuario ha tocado?

Cuestiones relacionadas