android camera 2 example
¿Qué puedo hacer cuando se ha abandonado el BufferQueue? (1)
Lo que estás haciendo es esencialmente lo que está escrito en los documentos de TextureView , por lo que debería funcionar.
El mensaje de error significa que el lado "productor" de BufferQueue
(la cámara) tomó un búfer y ahora está tratando de cancelBuffer()
través de cancelBuffer()
). Sin embargo, el lado del "consumidor" ( SurfaceTexture
) se ha ido. Debido a que el lado "consumidor" posee la cola, el BufferQueue
se considera abandonado y no es posible realizar más operaciones.
Esto parece que es solo un problema de tiempo: el productor está intentando realizar operaciones después de que SurfaceTexture
haya sido destruida. Lo que no tiene sentido, porque está cerrando al productor en onSurfaceTextureDestroyed()
, y el ST no se libera a menos que y hasta que la devolución de llamada sea true
. (Podría ser interesante agregar mensajes de registro al inicio y al final del método de devolución de llamada, y ver si la queja "abandonada" ocurre antes o después de ellos. Use logcat -v threadtime
para ver los ID de hilos).
Así que no estoy muy seguro de por qué esto está sucediendo. La buena noticia es que no debería afectar negativamente a su aplicación: el productor determinará correctamente que el consumidor se ha ido y se quejará, pero no se bloqueará. Así que es ruidoso pero no explota.
Por curiosidad, ¿ve mensajes como este en su dispositivo si ejecuta "Cámara en vivo (TextureView)" en Grafika ? Esa actividad es sacada de los documentos de TextureView
, y no veo ninguna queja cuando la ejecuto en mi dispositivo.
(Aquí puede encontrar información adicional sobre SurfaceTexture y BufferQueue).
Estoy usando una vista de textura para mostrar la vista previa de la cámara en mi aplicación de Android. Lo que noté, sin embargo, es que cada vez que mi aplicación se detiene, recibo este error:
03-18 18:23:44.315: W/BufferQueue(19582): [unnamed-19582-20] cancelBuffer: BufferQueue has been abandoned!
¿Puede alguien decirme qué está pasando aquí? Cuando mi aplicación se detiene, todo lo que hago es desinicializar todo esto de onSurfaceTextureDestroyed()
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
return true;
}