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

时间:2011-09-30 19:58:01

标签: android android-camera

我想利用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;
    }
}    

1 个答案:

答案 0 :(得分:1)

我怀疑方向改变是否导致了这种情况。我发现只要一个活动停止但你没有在onPause中调用Camera.release,你就会得到那个错误。结果是,当您下次尝试执行Camera.open时,您会收到运行时错误,因为无论打开它的应用程序/活动是什么,驱动程序仍会将其视为打开。

当某些事情抛出异常并使活动失效时,您可以轻松地在调试/测试内容时实现此目的。您需要非常勤奋地捕捉所有异常,并确保在完成活动之前释放相机。

顺便说一下,您是否发现需要重新启动设备才能再次打开相机?