为啥我的相机应用程序崩溃了?

Posted

技术标签:

【中文标题】为啥我的相机应用程序崩溃了?【英文标题】:Why is my camera app crashing?为什么我的相机应用程序崩溃了? 【发布时间】:2012-04-20 19:32:25 【问题描述】:

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;
    

【问题讨论】:

将代码发布到您的运行方法中,这似乎是崩溃发生的地方 【参考方案1】:

从堆栈跟踪来看,您似乎有一些TimerTask 仍计划使用相机执行。它在您关闭相机后触发,因此出现错误。您需要cancel()Timer,并准备好最后一个TimerTask 在您取消之前可能正在进行中。所以任务在对其进行操作之前需要检查相机是否关闭。

【讨论】:

我在关闭应用程序之前取消了我的 TimerTask。重新打开后预览仍然显示,但是当我尝试拍摄另一张照片时,我会强制关闭。 (这是一款延时摄影应用)。 (@AustynMahoney:我没有投反对票。您的陈述是正确的,尽管我认为 OP 的问题是为什么会发生这种情况。) @hotnspicyxp:那么您可能会保留对Camera 的旧引用。您可能应该在 onResume()onPause() 中启动/停止相机,而不是这些方法,因为我认为它们不会在您想到时被调用。 谢谢。这正是正在发生的事情。【参考方案2】:

本质上,您是在调用 mCamera 对象的 release 方法并且操作系统已在其本机代码中发布它之后尝试使用它。

该对象仍然存在(因此您的 mCamera == null 计算结果为 false),但如果不创建新对象或调用再次获取本机资源的方法,则无法再使用该对象。

【讨论】:

以上是关于为啥我的相机应用程序崩溃了?的主要内容,如果未能解决你的问题,请参考以下文章

Media Recorder 示例应用程序崩溃 - 为啥会这样?

我的程序崩溃了,我不知道为啥

激活 iPhone 相机操作会使我的应用程序崩溃 [重复]

相机在 android jelly bean 中崩溃

Cordova Ios 应用程序在相机访问时崩溃

为啥我的 Erlang 应用程序崩溃了?