我想利用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;
}
}
答案 0 :(得分:1)
我怀疑方向改变是否导致了这种情况。我发现只要一个活动停止但你没有在onPause中调用Camera.release,你就会得到那个错误。结果是,当您下次尝试执行Camera.open时,您会收到运行时错误,因为无论打开它的应用程序/活动是什么,驱动程序仍会将其视为打开。
当某些事情抛出异常并使活动失效时,您可以轻松地在调试/测试内容时实现此目的。您需要非常勤奋地捕捉所有异常,并确保在完成活动之前释放相机。
顺便说一下,您是否发现需要重新启动设备才能再次打开相机?