我正在使用Android APIDemo示例代码。
当我运行CameraPreview示例时,一开始它会给我一个错误。
我找到了问题所在,样本一度正常运行。
现在,它不再工作。它说:
ERROR/AndroidRuntime(2949): java.lang.RuntimeException: Fail to connect to camera service
这可能是什么原因呢?当调用camera.open()
时会发生这种情况。
谢谢,
Tee
确保正确释放所有已获取的相机资源:
@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;
}
}
}
请确保您的<uses-permission>
元素在AndroidManifest.xml文件中处于正确的位置。
如果您的活动在 surfaceDestroyed
或 onConfigurationChanged
中未正确关闭相机,则会发生此情况...
每次离开活动时,请不要忘记执行以下操作:
if (camera!=null){
camera.stopPreview();
camera.release();
camera=null;
}
导致此错误的另一个原因是当您尝试打开相机时,其他应用程序甚至您的应用程序已经在使用相机。
我在HTC设备上也遇到了这种问题。为解决此问题,请添加以下代码:
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if (camera!=null)
{
camera.stopPreview();
camera.release();
camera=null;
}
}
正如其他人所提到的,当你完成时,必须调用release()释放相机对象。
起初我没有这样做,所以我改变了我的代码,但它仍然给我同样的错误。我直接部署到一个物理手机上,并且在它工作之前必须重新启动手机。
当我测试时,在代码中还没有到达以下位置,我就停止了执行,导致我也收到了此错误:
if (camera!=null){
camera.stopPreview();
camera.release();
camera=null;
}
被调用了。这导致相机被阻塞,因为它没有被正确释放。我的解决方案是将相机关闭然后重新打开。您可以通过尝试在手机中使用内置的相机应用程序来确认这一点。它也无法工作,因为它仍然忙碌。
第二个 @matt-burns,不过你可能需要检查一下是否只尝试获取一次相机。我曾经忘记注释掉一行代码,导致尝试启动两个活动都会尝试获取相机。