android / android/camera-samples

Random crash with repeated Record/Preview

Abierto
#495 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Kotlin
Estrellas
5.5k
Forks
2.4k
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

UPDATE: This appears to be related to https://github.com/android/camera-samples/issues/109, But with Camera2 instead of CameraX.

I've built a test app using Camera2 video and MediaRecoder. This was seemingly working, but I was having random crashes when stopping record when repeatedly starting/stopping recording. The result of this record state change is that the previewBuilder gets rebuilt with previewSurface + recordSurface (record Start), or just previewSurface (record Stop).

To track it down, I made the code cycle 100 times thru a 10 second record/stop at 15 second intervals. With this approach, I can almost always see a crash, though it could be at iteration 3 or at 80, sometimes not until 300. I've done this testing on multiple Galaxy S9/10 devices as well as on a Pixel 4. All fail the same way, eventually.

The crashes appear to happen either at CreateCaptureRequest or at CreateCaptureSession. And the errors vary from crash to crash, usually being one of these:

  • [Binder] java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List android.hardware.camera2.params.OutputConfiguration.getSurfaces()' on a null object reference

  • CAMERA_ERROR (3): waitUntilIdle:1701: Camera 0: Error waiting to drain: Connection timed out (-110)

  • android.hardware.camera2.CameraAccessException: CAMERA_ERROR (3): The camera device has encountered a serious error

  • android.os.ServiceSpecificException: createDefaultRequest:1644: Camera 0: Error creating default request for template 3: Function not implemented (-38) (code 10)

  • CameraCaptureSession Session 4: Failed to create capture session; configuration failed

I have not figured out how to recover from the error to get the app back into an expected state consistently. try/catch isn't working, as the error seems to occur in some async camera2 functionality. I can see that OnConfigureFailed is called, but by the time that's happened, it's already at some other part of the code which will fail. I tried to separate further along steps to be triggered by OnConfgured/OnReady, to isolate where the crash is happening, but it doesn't seem to be consistent, and this didn't stop the crash from happening.

My best guess is that some background activity, outside my app, is in conflict at the random point in time when my recording is changing states. But, I can't be sure of that.

I've added a ton of tracking into my code to try and isolate this, but no matter what I do, the result is the same. I'm stumped.

I also tried to make it so that I did not rebuild the previewBuilder with every record state change. But this didn't work because of the use of MediaRecorder for which there doesn't seem to be a way to Stop/Start it without recreating it.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

No se identifica ningún archivo del repositorio ni ninguna prueba. Empieza reproduciendo el ciclo repetido de inicio/parada de vídeo de Camera2 y MediaRecorder descrito en el issue, y después examina las rutas CreateCaptureRequest, CreateCaptureSession y OnConfigureFailed junto con los errores de cámara indicados. Se considera terminado cuando el ciclo repetido ya no provoca un bloqueo y la aplicación vuelve a un estado esperado después de los errores.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
android, kotlin
Área
mobile
Tipo de issue
Error
Dificultad
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.