运行时错误:无法连接到android中的摄像头服务

运行时错误:无法连接到android中的摄像头服务,android,android-camera,Android,Android Camera,我想利用zxing库在我的应用程序中检测qrcodes。但是为了查看应用程序,我不得不将自定义显示方向更改为纵向。因此,我必须将整个zxing库集成到我的应用程序中,并将camera.setDisplayOrientation(90)添加到openDriver()方法中。 完成此操作后,程序可以运行,但我随机得到“运行时异常:无法连接到相机服务” public void openDriver(SurfaceHolder holder) throws IOException { if (cam

我想利用zxing库在我的应用程序中检测qrcodes。但是为了查看应用程序,我不得不将自定义显示方向更改为纵向。因此,我必须将整个zxing库集成到我的应用程序中,并将camera.setDisplayOrientation(90)添加到openDriver()方法中。 完成此操作后,程序可以运行,但我随机得到“运行时异常:无法连接到相机服务”

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(),我将在那里释放相机!