来自 PreviewCallback 的 android 相机发布错误

Posted

技术标签:

【中文标题】来自 PreviewCallback 的 android 相机发布错误【英文标题】:android camera release error from PreviewCallback 【发布时间】:2012-04-07 10:42:27 【问题描述】:

所以我已经阅读了相机 API,但在这方面找不到任何东西。我正在使用相机来抓取帧并且它工作得很好,直到我尝试释放相机。我在一系列调用中复制了错误:

camera = Camera.open();
camera.setPreviewDisplay(getHolder());
Parameters params = camera.getParameters();
List<Size> ls = params.getSupportedPreviewSizes();
Size size = ls.get(1);
this.width = size.width;
this.height = size.height;
params.setPreviewSize(size.width, size.height);
camera.setParameters(params);
camera.setDisplayOrientation(90);
camera.setPreviewCallback(this);
camera.startPreview();
camera.stopPreview();
camera.release();

我得到的错误是

03-22 13:31:42.592: E/androidRuntime(14152): java.lang.RuntimeException: Method called after release()
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.hardware.Camera.setHasPreviewCallback(Native Method)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.hardware.Camera.access$600(Camera.java:114)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.hardware.Camera$EventHandler.handleMessage(Camera.java:545)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.os.Handler.dispatchMessage(Handler.java:99)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.os.Looper.loop(Looper.java:130)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at android.app.ActivityThread.main(ActivityThread.java:3684)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at java.lang.reflect.Method.invokeNative(Native Method)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at java.lang.reflect.Method.invoke(Method.java:507)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:845)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603)
03-22 13:31:42.592: E/AndroidRuntime(14152):    at dalvik.system.NativeStart.main(Native Method)

所以无论发生什么都不在我的职能之一中。 如果我注释掉 camera.setPreviewCallback(this);那么这个错误不会出现,但我显然失去了我的回调,这是在我的应用程序中包含相机的全部意义。

【问题讨论】:

我也遇到了同样的问题,我用http://***.com/a/34064944/4531507修复了它 一般规则是任何相机调用都可以在任何时候抛出 RuntimeException,即使具体调用没有正式记录此异常。如果您的测试设备永远不会出现这种异常行为,请放心,硬件、ROM 和已安装软件的某些不幸叠加会以可重现或不可重现的方式导致此崩溃。 【参考方案1】:

您必须在camera.release() 之前、camera.stopPreview() 之后取消设置预览回调:

camera.setPreviewCallback(null);

否则它可能会在相机释放后被调用。

【讨论】:

这对我也有用。其他***答案提到了它,但对我来说关键是它需要在camera.stopPreview和camera.release()之间完成。谢谢! 如果这没有帮助,请尝试遵循稍微不同的建议:***.com/a/13358179/192373【参考方案2】:

附带说明,完整的releaseCamera 方法如下所示:

// release Camera for other applications
private void releaseCamera() 
    // check if Camera instance exists
    if (mCamera != null) 
        sPreviewing = false;
        // first stop preview
        mCamera.stopPreview();
        // then cancel its preview callback
        mCamera.setPreviewCallback(null);
        // and finally release it
        mCamera.release();
        // sanitize you Camera object holder
        mCamera = null;
    

【讨论】:

就是这样,这就是所有必要的!小心把它放在正确的地方,因为我的问题是我有第二个地方,我试图stopPreview(),当然它崩溃了.. @Apostrofix,为了停止相机,如果您在多个地方使用它,您可能需要创建另一种方法,或者在停止之前检查“mCamera”对象是否为空。

以上是关于来自 PreviewCallback 的 android 相机发布错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在android studio中获取camera2 api中的每一帧,例如camera api中的PreviewCallback和camerax中的ImageAnalysis.Analyzer?

java 警报对话框。字体:来自https://stackoverflow.com/questions/2115758/how-do-i-display-an-alert-dialog-on-andr

关于使用Android新版Camera即Camera2的使用介绍 暨解决Camera.PreviewCallback和MediaRecorder无法同时进行

WAMP 403 禁止来自外部来源

使用 Android L 和 Camera2 API 处理相机预览图像数据

来自 pb 和 h5 文件的不同预测