Hemos estado luchando con algunos problemas relacionados con SurfaceViews durante más de una semana, y no encontramos una solución adecuada para ellos. Leemos las otras preguntas en el foro con respecto a problemas similares (e incluso el código fuente de Mixare) pero no pudimos encontrar una respuesta, por lo que esperamos que nos ayudes de alguna manera.Luchando con SurfaceView, la cámara y OpenGL
Escenario: , Tenemos que
- un SurfaceView de la cámara
- un SurfaceView para una capa de OpenGL, lo que va en la parte superior de la cámara.
- otra Vista, que muestra información sobre lo que podemos ver en la pantalla. Este se encuentra en la parte superior de ambos SurfaceViews.
Problema:
No importa cuánto nos esforcemos, ambos SurfaceViews aparentemente no se llevan bien entre sí. Si tratamos de:
setContentView(mCameraPreview);
addContentView(mGLSurfaceView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
(lo cual parece lógico), todo sale como se espera hasta que bloquear/desbloquear el teléfono. Después de eso, el GLSurfaceView simplemente desaparece (no el InfoView, ese aún se muestra).
Si, en cambio, tratamos de:
setContentView(mGLSurfaceView);
addContentView(mCameraPreview, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
Entonces, el problema es que el GLSurfaceView sólo aparece después de bloqueo/desbloqueo, y antes de que la pantalla está mostrando la cámara y el InfoView.
Descubrimos que si dormimos el hilo principal durante 4.6 segundos (o más) después de ejecutar onStart() en la actividad que muestra las vistas, el comportamiento es el esperado (se muestran las vistas de cámara, superficie e información, incluso después de bloquear/desbloquear).
Lo que pasa es que estamos buscando una solución más ... elegante.
Nos parece que el problema es que la cámara tarda más de lo esperado en Camera.open()
, por lo que se agrega la Vista de cámara, se agrega GLSurfaceView y cuando la cámara se abre, se abre en la parte superior de GLSurfaceView. Con respecto a esto, usamos bringToFront()
en GLSurfaceView, y lo obtuvimos en la vista de información, pero después de bloquear/desbloquear la cámara aún se abrió sobre ella, dejándonos con una pantalla con la vista previa de la cámara solamente.
¿Alguna idea? ¿Cómo podemos mostrar SurfaceViews y la vista de información sobre ellos?
Su pregunta va más allá de mi conocimiento, pero asegúrese de hacer llamadas a GLSurfaceView.onPause() y GLSurfaceView.onResume() como se supone que debe hacerlo desde su contenedor Activity. Eso es todo lo que puedo pensar sobre este tema. – harism
Parece que estamos tratando de abordar el mismo problema. No vi su pregunta cuando me envió [mi] (http://stackoverflow.com/questions/5778647/how-to-properly-use-setzordermediaoverlay-on-android). ¿Intentó 'setZOrderMediaOverlay()'?Lo intenté pero no pude hacer funcionar este escenario. Quizás puedas descubrir cómo usarlo y solucionar este problema. – alokoko