2011-07-12 17 views
11

Estoy usando la API de la cámara en Android y conseguí que mi código funcione en varias plataformas, incluidas Samsung Galaxies y HTC Desire. Hasta ahora solo estoy experimentando un problema en el HTC Desire Z, que es intermitente.Retrollamada de autoenfoque de la cámara no está ocurriendo

en mi código Voy a llamar a las siguientes instrucciones

camera.startPreview(); 
camera.autoFocus(autoFocusCallback); 

donde ya ha creado la clase autoFocusCallback requerido. Me gustaría volver a insistir en que este código funciona en los teléfonos, incluido el que tengo problemas, así que no sigas escrutando el código. :) Después de que se llama la devolución de llamada, mi código luego toma la fotografía, pero esa parte es irrelevante por ahora.

El problema intermitente es que para una cierta imagen aleatoria (ocurre una de 20-100 veces), la devolución de llamada no ocurre. He verificado con mi propio Log.i() que este es el último comando realizado (es decir, el código no llega a la devolución de llamada). La depuración también muestra que no se informan errores.

Sólo para fijar su mente en la facilidad, mi devolución de llamada es como la siguiente

AutoFocusCallback autoFocusCallback = new AutoFocusCallback() { 
    @Override 
    public void onAutoFocus(boolean success, Camera camera) { 
    Log.i("tag","this ran"); 
    ... 
    ... 
    } 
}; 

Los resultados LogCat para una carrera exitosa se ve algo como esto

07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): startPreview X 
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): autoFocus E 
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): autoFocus X 
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): runAutoFocus E 
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): af start (fd 49) 
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): native_set_afmode: ctrlCmd.status == 0 
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): af done: 1 
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): runAutoFocus X 
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): takePicture(479) 

Pero la carrera problemático es como esto

07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): startPreview X 
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): autoFocus E 
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): autoFocus X 
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): runAutoFocus E 
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): af start (fd 49) 

y luego se cuelga.

Me gustaría saber si alguien tiene alguna idea sobre este problema, o si ha experimentado algo similar? Solo he logrado encontrar un hilo en la red con problemas similares, aquí está http://groups.google.com/group/android-developers/browse_thread/thread/75ecb8db0ae02bdb

Respuesta

3

No es una solución a su problema específico, pero la pregunta en general es que puede llamar al enfoque automático antes de comenzar la vista previa. En este caso, tampoco hay enfoque automático cuando se activa la vista previa.

Desde el documentation

"Este método sólo es válido cuando es vista previa activa (entre startPreview() y antes stopPreview())."

+0

Excelente respuesta !. ¡¡Gracias!! – superUser

4

Las llamadas de enfoque automático no tienen un tiempo de espera excedido. Me he encontrado con algunos dispositivos en los que las llamadas de autofoco no se devuelven de forma esporádica (incluso en perfectas condiciones). Donde el mismo código funciona bien en otros dispositivos.

Mi solución fue rodar mi propio mecanismo de tiempo de espera para el enfoque automático. Lo hice con un futuro programado, pero la mejor implementación de tiempo de espera puede depender de su caso de uso específico.

final ScheduledFuture<?> focusTimeoutFuture = mScheduledExecutorService.schedule(new Runnable() { 
     @Override 
     public void run() 
     { 
      takePictureAndCancelAutoFocus(); 
     } 
    }, 3, TimeUnit.SECONDS);// add a 3 second timeout to autofocus 

mCamera.autoFocus(new Camera.AutoFocusCallback() { 
     @Override 
     public void onAutoFocus(boolean b, Camera camera) 
     {     
      // cancel the timeout future if it didn't run already 
      boolean canceledFuture = focusTimeoutFuture.cancel(false); 
      if(canceledFuture) 
      { 
       takePictureAndCancelAutoFocus(); 
      } 
     } 
} 
+0

No usé exactamente su solución, pero realmente me ayudó. Por ejemplo. LG Spirit deja de enfocarse después de un enfoque exitoso. –

Cuestiones relacionadas