2012-04-20 2 views
0

API 15. Когда я прекращаю свою камеру после съемки и перейти на главный экран и открыть мое приложение и попытаться сделать еще один снимок, мое приложение вылетает, и я получаю эту ошибку:Почему приложение моей камеры разбивается?

04-20 12:04:38.437: E/AndroidRuntime(5150): FATAL EXCEPTION: Timer-2 
04-20 12:04:38.437: E/AndroidRuntime(5150): java.lang.RuntimeException: Method called after release() 
04-20 12:04:38.437: E/AndroidRuntime(5150):  at android.hardware.Camera.native_takePicture(Native Method) 
04-20 12:04:38.437: E/AndroidRuntime(5150):  at android.hardware.Camera.takePicture(Camera.java:947) 
04-20 12:04:38.437: E/AndroidRuntime(5150):  at android.hardware.Camera.takePicture(Camera.java:892) 
04-20 12:04:38.437: E/AndroidRuntime(5150):  at com.prism.app.PrismActivity$5.run(PrismActivity.java:167) 
04-20 12:04:38.437: E/AndroidRuntime(5150):  at java.util.Timer$TimerImpl.run(Timer.java:284) 


public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, now tell the camera where to draw the preview. 
    if (mCamera == null) { 
     try { 
      mCamera = Camera.open(); 
      mCamera.setPreviewDisplay(holder); 
      mCamera.setDisplayOrientation(90); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      // error setting preview of camera 
     } 
    } else { 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // empty. Take care of releasing the Camera preview in your activity. 
    if (mCamera != null) { 
     mCamera.setPreviewCallback(null); 
     mCamera.stopPreview(); 
     mCamera.release(); //need to take care of case when app is not closed completely still need to release 
     mCamera = null; 
    } 
} 
+0

Отправьте код вашему методу запуска, в котором происходит сбой. – dymmeh

ответ

0

Из трассировки стека, похоже, у вас есть , который по-прежнему планируется выполнить, который использует камеру. Это срабатывает после закрытия камеры, что приводит к ошибке. Вам нужно cancel()Timer, а также быть готовым к тому, что последние TimerTask могут быть выполнены до момента отмены. Поэтому задача должна быть проверена, закрыта ли камера, прежде чем она начнет работать.

+0

Я отменил свой TimerTask, прежде чем закрыть приложение. Предварительный просмотр по-прежнему появляется после того, как я снова открылся, но у меня сила закрывается, когда я пытаюсь сделать еще одну снимок. (Это своего рода приложение с временной шкалой). – kdhuang

+0

(@AustynMahoney: я ничего не делал. Ваше утверждение правильное, хотя я думаю, что вопрос OP состоит в том, почему это происходит.) –

+0

@hotnspicyxp: Тогда вы, вероятно, придерживаетесь старой ссылки на 'Camera' , Вероятно, вы должны запустить/остановить камеру в 'onResume()' и 'onPause()' не эти методы, поскольку я не думаю, что они вызываются, когда вы думаете. –

-1

По сути вы пытаясь использовать ваш объект mCamera после того, как был вызван его метод выпуска, и ОС выпустила его в своем собственном коде.

Объект все еще существует (поэтому ваш mCamera == null оценивает false), но объект больше не может использоваться без создания нового или вызова метода, который снова захватывает собственные ресурсы.

Смежные вопросы