安卓 - 无法连接相机

31

我正在使用Android APIDemo示例代码。

当我运行CameraPreview示例时,一开始它会给我一个错误

我找到了问题所在,样本一度正常运行。
现在,它不再工作。它说:

ERROR/AndroidRuntime(2949): java.lang.RuntimeException: Fail to connect to camera service  

这可能是什么原因呢?当调用camera.open()时会发生这种情况。

谢谢,
Tee

9个回答

28

确保正确释放所有已获取的相机资源:

    @Override
public void surfaceDestroyed(SurfaceHolder holder) {
    if (mCam != null) {
        mCam.stopPreview();
        mCam.setPreviewCallback(null);
        mCam.release();
        mCam = null;
    }
}

    @Override
public void surfaceCreated(SurfaceHolder holder) {
    if (mCam == null) {
        mCam = Camera.open();
        try {
            mCam.setPreviewDisplay(holder);

            // TODO test how much setPreviewCallbackWithBuffer is faster
            mCam.setPreviewCallback(this);
        } catch (IOException e) {
            mCam.release();
            mCam = null;
        }
    }
}

错误信息非常晦涩,我甚至在仅仅启动和停止预览之间就遇到了这个问题(有引擎级别的编码出现了严重问题,这不是你的错)。我发现在启动和停止预览之间释放相机可以解决这个错误。 - Aggressor

17

2
我仍然会随机地遇到这个错误。我的一个活动连接到相机,在模拟器上拍摄一些照片,将数据传递给下一个活动。当我延迟一段时间重新启动该活动时,应用程序会因为同样的错误而崩溃。但是,当我作为全新启动完整应用程序时,它下次就能正常工作了。 - Nayn
好的,权限应该放在<application>标签外面。 - vir us

5

如果您的活动在 surfaceDestroyedonConfigurationChanged 中未正确关闭相机,则会发生此情况...

每次离开活动时,请不要忘记执行以下操作:

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

4

导致此错误的另一个原因是当您尝试打开相机时,其他应用程序甚至您的应用程序已经在使用相机。


它必须是一个没有正确释放相机的应用程序,对吧?有没有一些相对常见的应用程序不释放相机? - Kat

2

我在HTC设备上也遇到了这种问题。为解决此问题,请添加以下代码:

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    if (camera!=null)
    {
        camera.stopPreview();
        camera.release();
        camera=null;
    }
}

但你不能启动相机然后重启设备。

1
@Override protected void onDestroy() { try { camera.stopPreview(); camera.setPreviewCallback(null); try {camera.release();} catch (Exception e) {} camera = null; preview = null; } catch (Exception e) {} super.onDestroy(); } - PankajAndroid

2
此外,如果您正在使用模拟器,请确保已选择模拟前置摄像头和/或后置摄像头。 Android虚拟设备管理器->选择设备->编辑->前置摄像头->模拟。

1

正如其他人所提到的,当你完成时,必须调用release()释放相机对象。

起初我没有这样做,所以我改变了我的代码,但它仍然给我同样的错误。我直接部署到一个物理手机上,并且在它工作之前必须重新启动手机。


0

当我测试时,在代码中还没有到达以下位置,我就停止了执行,导致我也收到了此错误:

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

被调用了。这导致相机被阻塞,因为它没有被正确释放。我的解决方案是将相机关闭然后重新打开。您可以通过尝试在手机中使用内置的相机应用程序来确认这一点。它也无法工作,因为它仍然忙碌。


0

第二个 @matt-burns,不过你可能需要检查一下是否只尝试获取一次相机。我曾经忘记注释掉一行代码,导致尝试启动两个活动都会尝试获取相机。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接