Camera.startPreview se bloquea y reinicia el teléfono después de varias sesiones de Actividad
Tengo una Activity
que abre la Camera
y comienza una inspección previo en SurfaceTexture
. Todo funciona bien, pero he notado que si dejo la actividad repetidamente y vuelvo a ella, después de un puñado de veces, el teléfono se congela y luego se reinicia.
He reducido el problema a la llamada a startPreview. Y recibo dos mensajes de registro ominoso justo antes de que ocurra el problema:
- ¿Cómo determino la orientación predeterminada de los marcos de previsualización de la cámara?
- MediaServer Remote Binder Objeto de cámara muerto - sólo en KITKAT
- Guardar la imagen capturada en el almacenamiento interno?
- ¿Qué puedo hacer cuando el BufferQueue ha sido abandonado?
- Abrir cámara Android en una resolución inferior con ACTION_IMAGE_CAPTURE
01-19 10:20:52.038: E/IMGSRV(22777): :0: __map: Map device memory failed 01-19 10:20:52.038: W/GraphicBufferMapper(22777): registerBuffer(0x70b750) failed -14 (Bad address)
¿Alguien ha visto esto antes? ¿Se trata de un problema con el hardware Galaxy Nexus o Android 4.0? Si es así, ¿hay algún trabajo alrededor?
Nota: Mis pruebas están en Android 4.0, con un Galaxy Nexus.
Editar – Solucionado:
Resulta que fue una pérdida de memoria debido a OpenGL. Todos los ejemplos en la web que podría encontrar utilizar el siguiente código para limpiar después de OpenGL.
try { mEgl.eglDestroyContext(mEglDisplay, mEglContext); } catch (Throwable t) {} try { mEgl.eglDestroySurface(mEglDisplay, mEglSurface); } catch (Throwable t) {}
Esto filtra la superficie, y como resultado después de un cierto número de intentos, que varía por teléfono, hará que OpenGL falle al inicializar. Por ejemplo, fallaría después de 32 intentos en el Nexus S, pero sólo 8 intentos en el LG Optimus.
Después de un cierto ensayo y error encontré que el código siguiente solucionó el problema:
mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
Nota: En el Nexus Galaxy en lugar de obtener un error de OpenGL agradable que podría mostrar al usuario que sólo parecía que se bloquea en startPreview. Supongo que esto estaba relacionado con la memoria, pero lo anterior fijado lo aclaró también.
- Iónico: la cámara pide confirmación después de cada foto / toma varias tomas
- Contador de obturador de cámara Android
- Actividad de la cámara que hace que uri pase a null cuando la orientación de la pantalla cambia
- Cómo omitir o evitar la opción de "volver a tomar y revisar" después de capturar la foto de la cámara mediante ACTION_IMAGE_CAPTURE
- Camera.Parameters bloqueo específico del dispositivo (Samsung S3 Mini)
- Los datos de imagen de la cámara Android2 API se voltearon y se aplastaron en la galaxia S5
- Utilizar la cámara del dispositivo Android como fondo de la actividad
- Selección entre cámara y galería para la selección de imágenes
Los documentos SDK para la clase android.hardware.Camera dicen lo siguiente:
Importante: Llamada de
release()
para liberar la cámara para su uso por otras aplicaciones. Las aplicaciones deben liberar la cámara inmediatamente enonPause()
(y re-open()
enonResume()
).
¿Está seguro de que su actividad libera la cámara en onPause()
y la vuelve a abrir en onResume()
?
Si publica un ejemplo de código, estaremos mejor preparados para solucionar su problema.
- Mensaje de notificación de AudioTrack corriente
- Mejores prácticas de administración de fragmentos para varios ListFragments