2012-04-20 79 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

郵政代碼到你的run方法是在崩潰似乎發生 – dymmeh 2012-04-20 19:48:26

回答

0

從堆棧跟蹤,它看起來像你有一些TimerTask這仍然是計劃執行它使用相機。它會在您關閉相機後觸發,從而導致錯誤。您需要cancel()Timer,並且還可以的事實,最後TimerTask可能正在從你取消前準備。因此,該任務需要在照相機運行之前檢查照相機是否已關閉。

+0

取消我的TimerTask之前,我關閉應用程序。在我重新開放後,預覽仍然顯示,但是當我嘗試拍攝另一張照片時,我會看到一個力量。 (這是一種timelapse應用程序)。 – kdhuang 2012-04-20 20:24:38

+0

(@AustynMahoney:我沒有downvote你什麼說法是正確的,但我覺得OP的問題是,爲什麼是這種情況的發生。) – 2012-04-20 20:42:39

+0

@hotnspicyxp:那麼你很可能持有一個老參照'Camera' 。你可能應該在onResume()和onPause()這些方法中啓動/停止攝像頭,因爲我不認爲他們會在你想的時候被調用。 – 2012-04-20 20:46:32

-1

基本上你是嘗試在釋放方法被調用後使用mCamera對象,並且操作系統已將其釋放到本機代碼中。

該對象仍然存在(因此您的mCamera == null評估爲false),但如果不創建新對象或調用再次獲取本機資源的方法,則無法再使用該對象。