Android El enfoque automático no funciona después de crear la vista de cámara

Estoy tratando de crear mi propia vista de cámara, tengo todo funcionando excepto el autofoco, no puedo entender por qué no funcionará. Aquí está mi código para CameraView.java

public class CameraView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder surface_Holder; private Camera main_Camera; boolean on; public CameraView(Context context, Camera camera){ super(context); main_Camera = camera; main_Camera.setDisplayOrientation(90); surface_Holder = getHolder(); surface_Holder.addCallback(this); surface_Holder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL); } public boolean isOn(){ return on; } @Override public void surfaceCreated(SurfaceHolder holder) { try{ main_Camera.setPreviewDisplay(holder); main_Camera.startPreview(); }catch (Exception e){ Log.d("Error", "Canmera error on surfaceCreated" + e.getMessage()); main_Camera.release(); main_Camera = null; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if(holder.getSurface()==null){ return; } try{ main_Camera.stopPreview(); }catch (Exception e){ } try{ main_Camera.setPreviewDisplay(surface_Holder); main_Camera.startPreview(); }catch (IOException e){ Log.d("Error", "Camera error on surfaceChanged " + e.getMessage()); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { main_Camera.setPreviewCallback(null); main_Camera.stopPreview(); main_Camera.release(); main_Camera= null; } } 

Dentro de mi manifiesto tengo lo siguiente:

 <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> 

3 Solutions collect form web for “Android El enfoque automático no funciona después de crear la vista de cámara”

 //set camera to continually auto-focus Camera.Parameters params = c.getParameters(); //*EDIT*//params.setFocusMode("continuous-picture"); //It is better to use defined constraints as opposed to String, thanks to AbdelHady params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); c.setParameters(params); 

Si has añadido <uses-feature android:name="android.hardware.camera.autofocus" /> a tu manifiesto no significa que la cámara hará autofocus . Significa que le da a su aplicación el permiso para utilizar el hardware o el software de la cámara que se encarga del autofoco.

El propósito de una declaración es informar a cualquier entidad externa del conjunto de características de hardware y software de las que depende su aplicación.

Para configurar la cámara para enfocar, puede agregar este método a su clase CameraView :

 private void setFocus(String mParameter) { Camera.Parameters mParameters = mCamera.getParameters(); mParameters.setFocusMode(mParameter); mCamera.setParameters(mParameters); } 

Y luego llamar a este método en surfaceChanged() así:

 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { ...//your code here // Set focus mode to continuous picture setFocus(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); // Start camera preview mCamera.startPreview(); } 

Puede elegir entre estos focus parameters :

String FOCUS_MODE_AUTO Modo de enfoque automático.

String FOCUS_MODE_CONTINUOUS_PICTURE Modo de enfoque automático continuo destinado a tomar fotografías.

String FOCUS_MODE_CONTINUOUS_VIDEO Modo de enfoque automático continuo destinado a la grabación de vídeo.

Cadena FOCUS_MODE_EDOF Profundidad de campo extendida (EDOF).

Cadena FOCUS_MODE_FIXED El enfoque está fijo.

Cadena FOCUS_MODE_INFINITY El enfoque se establece en el infinito.

Cadena FOCUS_MODE_MACRO Modo de enfoque macro (primer plano).

Estas son algunas opciones:

  1. El usuario arsalank2 recomienda utilizar "enfoque automático continuo" como se describe en esta respuesta . Sin embargo, parece que algunos dispositivos de HTC no apoyan esto. Compruebe con: parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTIN‌​UOUS_VIDEO)

  2. Puede implementar un detector onSensorChanged y enfocarse con una devolución de llamada cuando se cumplan ciertos criterios, vea esta respuesta de Juan Acevedo .

  3. Maneje cada caso de forma diferente para soportar la más amplia gama de dispositivos posibles. Compruebe lo que funciona con diferentes modelos de dispositivos diferentes, ya que no puede confiar plenamente en lo que el nivel de API dice que se implementa.

Yo recomendaría ir con la opción 3, ya que no parece haber ningún método que funciona para cada dispositivo.

  • Google map android api v2 falla en la aplicación
  • Servicio enlazado versus servicio iniciado en Android y cómo hacer ambas cosas
  • ¿Cómo integrar paytm wallet en la aplicación android?
  • Rotación de vídeo en modo retrato
  • ¿Pueden las aplicaciones de Android usar jarras compuestas java 8?
  • Cómo devolver una matriz u otro tipo de elementos de colecciones de phonegap android plugin
  • Comunicación de dispositivo a dispositivo en Android
  • Android: ¿Los elementos de las listas no se vuelven naranjas cuando se hace clic?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.