运行时错误:无法连接到android中的摄像头服务
我想利用zxing库在我的应用程序中检测qrcodes。但是为了查看应用程序,我不得不将自定义显示方向更改为纵向。因此,我必须将整个zxing库集成到我的应用程序中,并将camera.setDisplayOrientation(90)添加到openDriver()方法中。 完成此操作后,程序可以运行,但我随机得到“运行时异常:无法连接到相机服务”运行时错误:无法连接到android中的摄像头服务,android,android-camera,Android,Android Camera,我想利用zxing库在我的应用程序中检测qrcodes。但是为了查看应用程序,我不得不将自定义显示方向更改为纵向。因此,我必须将整个zxing库集成到我的应用程序中,并将camera.setDisplayOrientation(90)添加到openDriver()方法中。 完成此操作后,程序可以运行,但我随机得到“运行时异常:无法连接到相机服务” public void openDriver(SurfaceHolder holder) throws IOException { if (cam
public void openDriver(SurfaceHolder holder) throws IOException {
if (camera == null) {
camera = Camera.open();
camera.setDisplayOrientation(90);
if (camera == null) {
throw new IOException();
}
}
camera.setPreviewDisplay(holder);
if (!initialized) {
initialized = true;
configManager.initFromCameraParameters(camera);
}
configManager.setDesiredCameraParameters(camera);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
reverseImage = prefs.getBoolean(PreferencesActivity.KEY_REVERSE_IMAGE, false);
if (prefs.getBoolean(PreferencesActivity.KEY_FRONT_LIGHT, false)) {
FlashlightManager.enableFlashlight();
}
}
public void closeDriver() {
if (camera != null) {
FlashlightManager.disableFlashlight();
camera.release();
camera = null;
framingRect = null;
framingRectInPreview = null;
}
}
/**
* Asks the camera hardware to begin drawing preview frames to the screen.
*/
public void startPreview() {
if (camera != null && !previewing) {
camera.startPreview();
previewing = true;
}
}
/**
* Tells the camera to stop drawing preview frames.
*/
public void stopPreview() {
if (camera != null && previewing) {
if (!useOneShotPreviewCallback) {
camera.setPreviewCallback(null);
}
camera.stopPreview();
previewCallback.setHandler(null, 0);
autoFocusCallback.setHandler(null, 0);
previewing = false;
}
}
我怀疑方向的改变是造成这种情况的原因。我发现,每当某个活动停止,但在暂停时未能调用Camera.release时,您就会收到该错误。结果是,下次尝试执行Camera.open时,会出现运行时错误,因为驱动程序仍然认为它已打开,而不管打开它的应用程序/活动是否消失 当某些东西抛出异常并导致活动停止时,您可以在调试/测试东西时轻松实现这一点。您需要非常认真地捕捉所有异常,并确保在完成活动之前释放相机
顺便说一句,您是否发现需要关闭设备电源才能再次打开摄像头?我怀疑是方向改变造成的。我发现,每当某个活动停止,但在暂停时未能调用Camera.release时,您就会收到该错误。结果是,下次尝试执行Camera.open时,会出现运行时错误,因为驱动程序仍然认为它已打开,而不管打开它的应用程序/活动是否消失 当某些东西抛出异常并导致活动停止时,您可以在调试/测试东西时轻松实现这一点。您需要非常认真地捕捉所有异常,并确保在完成活动之前释放相机
顺便说一句,您是否发现需要关闭设备电源才能再次打开摄像头?谢谢您的回复。是的,要使它再次工作,我需要重新启动设备。如果问题总是发生,我会同意你的看法,我会退出应用程序并再次运行。但这是随机发生的。我正在确保在onPause()和onDestroy()中释放相机。您确定应用程序有时不会崩溃,然后无法进入onPause或onDestroy吗?onDestory不能保证被调用,我怀疑在活动中发生未捕获的异常时,onPause也会被跳过。你可以做一些日志记录并使用logcat确认你的应用程序在运行时异常之前正常结束吗?是的,我一直在这么做。主要的问题是,我无法重现这种情况,因为这种情况是随机发生的。有没有可能在某些情况下,相机需要更长的时间来释放,因此在下次程序运行时,资源不会完全释放?没有,我从来没有听说过释放需要太长时间…这是一个阻塞调用,所以一旦你从它返回,它就完成了。我真的仍然相信你有一些东西导致你的应用程序退出,而你的onPause(假设你从那里调用Camera.release)没有被调用。如果你到处都有try/catch,但它仍然是随机的,那么这听起来像是你的应用程序因为内存不足而被杀,这可以解释为什么你什么都没抓到&看起来是随机的,因为你永远也抓不到内存不足的情况。仔细检查logcat的输出,看看在我得到错误时,是否已经解决了强制关闭的问题。当我按下电源关闭按钮关闭屏幕(不关闭设备电源)时会发生这种情况。当我打开屏幕时,我得到了这个运行时异常(如果我立即打开屏幕,我不会得到这个错误)。我仍然不明白为什么会发生这种错误,因为当屏幕关闭时,应用程序会进入onPause(),我将在那里释放相机!谢谢你的回复。是的,要使它再次工作,我需要重新启动设备。如果问题总是发生,我会同意你的看法,我会退出应用程序并再次运行。但这是随机发生的。我正在确保在onPause()和onDestroy()中释放相机。您确定应用程序有时不会崩溃,然后无法进入onPause或onDestroy吗?onDestory不能保证被调用,我怀疑在活动中发生未捕获的异常时,onPause也会被跳过。你可以做一些日志记录并使用logcat确认你的应用程序在运行时异常之前正常结束吗?是的,我一直在这么做。主要的问题是,我无法重现这种情况,因为这种情况是随机发生的。有没有可能在某些情况下,相机需要更长的时间来释放,因此在下次程序运行时,资源不会完全释放?没有,我从来没有听说过释放需要太长时间…这是一个阻塞调用,所以一旦你从它返回,它就完成了。我真的仍然相信你有一些东西导致你的应用程序退出,而你的onPause(假设你从那里调用Camera.release)没有被调用。如果你到处都有try/catch,但它仍然是随机的,那么这听起来像是你的应用程序因为内存不足而被杀,这可以解释为什么你什么都没抓到&看起来是随机的,因为你永远也抓不到内存不足的情况。仔细检查logcat的输出,看看在我得到错误时,是否已经解决了强制关闭的问题。当我按下电源关闭按钮关闭屏幕(不关闭设备电源)时会发生这种情况。当我打开屏幕时,我得到了这个运行时异常(如果我立即打开屏幕,我不会得到这个错误)。我仍然不明白为什么会发生这种错误,因为当屏幕关闭时,应用程序会进入onPause(),我将在那里释放相机!