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:

 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.

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 en onPause() (y re- open() en onResume() ).

¿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.

  • onPreviewFrame y la superficie de bloqueo de excepción
  • Obtener Ruta de la imagen desde ACTION_IMAGE_CAPTURE Propósito
  • Permitir que el usuario seleccione cámara o galería para la imagen
  • Nexus 10, frente a la cámara de vista previa es negro (sin vista previa)
  • Cómo capturar una imagen en Android con tamaño fijo?
  • Cámara personalizada android
  • Android Video Recording, intención de la cámara
  • resultcode y datos null in onActivityresult
  • ¿Cómo usar la cámara de Android o la API de la cámara2 para admitir versiones antiguas y nuevas de la API sin notas de reprobación?
  • Cómo capturar la imagen en miniatura Y guardar el archivo en una carpeta personalizada en Android
  • Torch / Flashlight app (android.hardware.camera está obsoleto)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.