3

我得到一个异常,同时释放相机对象“java.lang.RuntimeException:发布后的方法”如何检查android.hardware.Camera是否被释放?

以下是我的代码和异常堆栈跟踪。

if (camera != null) { 
    camera.stopPreview();    
    camera.release(); 
    camera = null; 
} 

异常堆栈跟踪 -

java.lang.RuntimeException: Method called after release() 
Thread[main,5,main] android.hardware.Camera._stopPreview(Native Method) 
android.hardware.Camera.stopPreview(Camera.java:626) 
com.s5.selfiemonkey1.activity.Preview.surfaceDestroyed(Preview.java:152) 
android.view.SurfaceView.updateWindow(SurfaceView.java:601) 
android.view.SurfaceView.access$000(SurfaceView.java:88) 
android.view.SurfaceView$3.onPreDraw(SurfaceView.java:183) 
android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:680) 
android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2123) 
android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139) 
android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4872) 
android.view.Choreographer$CallbackRecord.run(Choreographer.java:776) 
android.view.Choreographer.doCallbacks(Choreographer.java:579) 
android.view.Choreographer.doFrame(Choreographer.java:548) 
android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762) 
android.os.Handler.handleCallback(Handler.java:800) 
android.os.Handler.dispatchMessage(Handler.java:100) 
android.os.Looper.loop(Looper.java:194) 
android.app.ActivityThread.main(ActivityThread.java:5371) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:525) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 

它看起来像stopPreview()被调用释放的对象上。

+1

[This] [1] post也处理相同的问题。希望它可以帮助你。 [1]:http://stackoverflow.com/questions/13235306/method-called-after-release-exception-camera-preview –

+0

谢谢,但有什么办法来检查相机被释放? –

回答

3

我已经做了一个方法,将返回我布尔值取决于相机是否在使用或不。下面是一个小snipet:

public static Camera checkForCamera(){ 
    Camera camera = null; 
    try { 
     camera = Camera.open(); // this line will throw exception if camera is not in use. 
    } 
    catch (Exception e){ 
     // if exception is thrown, return your boolean value here... 
    } 
    return camera; // if instance of camera, if it is not available it will return null. 
} 
+0

感谢您的回答,它的工作原理。 –

+1

但我记得Camera.open是昂贵的方法。所以,也许不是理想的方法。 –