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.

  • ¿Existe alguna razón para usar el patrón de observador en un receptor de difusión?
  • ¿Cómo añado iconos a la plantilla de gavetas de navegación de Android Studio?
  • Tablas personalizadas de Chrome Oauth2 Flow
  • Cómo limpiar caché de proyecto en Intellij idea como Eclipse limpio?
  • Conversión de mapa de bits: Creación de mapa de bits que excluye los lados transparentes del mapa de bits transparente
  • Calcular Duración
  • ¿Existe realmente el Objeto Inmortal?
  • 'While' no puede completar sin lanzar una excepción - Android
  • Android días restantes
  • Cómo crear matriz de objetos con For Loop en Android
  • Cómo cambiar la línea de fondo de EditText mediante programación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.