Se ha superado el recuento de búfer de undequeued mínimo

Estoy usando una SurfaceTexture para obtener marcos de vista previa de la siguiente manera.

En primer lugar, establecer una textura de vista previa:

camera.setPreviewTexture(new SurfaceTexture(0)); 

A continuación, justo antes de iniciar la vista previa y luego cada vez que se llama onPreviewFrame , establezco el búfer de devolución de llamada de la siguiente manera:

 camera.addCallbackBuffer(buffer); camera.setPreviewCallbackWithBuffer(this); 

Funciona. A veces, tomo una foto usando camera.takePicture(null, null, callback) , lo que resulta en llamar onPictureTaken correctamente. Se guarda la imagen. Dado que quiero reiniciar la vista previa después de tomar la foto, hago lo siguiente:

 try { camera.setPreviewTexture(new SurfaceTexture(0)); camera.startPreview(); } ... 

La vista preliminar se reinicia y todo parece estar bien. Pero el error siguiente se informa en mi Logcat, aparentemente después de que la inspección previo se haya recomenzado:

 E/BufferQueue﹕ [unnamed-5682-5] dequeueBuffer: min undequeued buffer count (2) exceeded (dequeued=5 undequeudCount=1) 

¿Me estoy perdiendo de algo? ¿Debo liberar la textura antigua en algún momento?

Configuración: Samsung Galaxy S4, Samsung Galaxy S5, Nexus 5, corriendo en Android KitKat.

EDIT: No estoy seguro si está vinculado o no, pero después de un tiempo, mi aplicación no toma fotos y los siguientes mensajes aparecen continuamente en mi Logcat:

 E/LocSvc_api_v02( 318): I/---> locClientSendReq line 2332 QMI_LOC_INJECT_SENSOR_DATA_REQ_V02 E/gsiff_dmn( 318): I/loc_api_resp_ind_callback: Received LocAPI Resp ind = 77 E/LocSvc_api_v02( 318): D/loc_sync_process_ind:172]: loc_sync_array not in use E/LocSvc_utils_q( 318): D/msg_q_rcv: Received message 0xB899D940 rv = 0 E/gsiff_dmn( 318): I/gsiff_data_task: Handling message type = 4 E/gsiff_dmn( 318): I/gsiff_daemon_inject_sensor_data_handler: Sending Sensor Data to LocApi. opaque_id = 1226 E/LocSvc_api_v02( 318): I/---> locClientSendReq line 2332 QMI_LOC_INJECT_SENSOR_DATA_REQ_V02 E/gsiff_dmn( 318): I/loc_api_resp_ind_callback: Received LocAPI Resp ind = 77 E/LocSvc_api_v02( 318): D/loc_sync_process_ind:172]: loc_sync_array not in use E/mm-camera( 284): [cpp_hardware_process_frame:997] Too many cpp frames dropped!! E/mm-camera( 284): cpp_thread_handle_process_buf_event:224] get buffer fail. drop frame id:1845 identity:0x20002 W/QCamera2HWI( 269): [CHECK_BUF_LOCK] Too many preview buffer is locked by surfaceflinger : 29 E/mm-camera( 284): [cpp_hardware_process_frame:997] Too many cpp frames dropped!! E/mm-camera( 284): cpp_thread_handle_process_buf_event:224] get buffer fail. drop frame id:1846 identity:0x20002 

EDIT 2: Si, en lugar de una new SurfaceTexture(0) , siempre utilizo la misma SurfaceTexture (que mantengo como miembro), entonces algunos errores desaparecen y la aplicación continúa funcionando. El min undequeued buffer count exceeded error y el Too many preview buffer is locked by surfaceflinger advertencia de la Too many preview buffer is locked by surfaceflinger .

Parece que la cámara está sosteniendo algo en su búfer que no es dequeued por su actividad. Debe encontrar la forma de borrar el búfer de la cámara cuando inicie una nueva vista previa.

Como se puede encontrar en la documentación de Android acerca de la clase Camera:

La cola del búfer se borrará si se llama a este método [setPreviewCallbackWithBuffer] con una devolución de llamada nula, se llama setPreviewCallback (Camera.PreviewCallback) o se llama setOneShotPreviewCallback (Camera.PreviewCallback).

Así que tal vez es suficiente para eliminar su devolución de llamada cuando se toma una imagen y, a continuación, restablecerlo cuando reinicie su vista previa.

  • Configuración de la API de la cámara Android en ISO?
  • El flash de la cámara Nexus 4 no se dispara cuando el modo de enfoque está ajustado en imagen continua
  • Deje de guardar la imagen cuando abra la cámara usando Intentar desde mi aplicación
  • Filtrar fuentes de infrarrojos desde una imagen de cámara Android
  • Camera.open () devuelve NULL Android desarrollo
  • Obtener imagen Uri + miniatura de la foto tomada con la cámara en Android
  • ¿Cómo implementar la funcionalidad de la cámara con opciones adicionales (como Panorama)?
  • ¿Cómo se relacionan las devoluciones de llamada de SurfaceHolder con el ciclo de vida de la actividad?
  • Cómo dibujar una superposición en un SurfaceView utilizado por la cámara en Android?
  • ¿Cómo crear una vista previa de la cámara usando API 21 android?
  • Android: orientación / rotación de la pantalla para la vista previa de la cámara
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.