无法连接到相机服务

我将相机设置为this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 它工作正常,但如果我将其更改为PORTRAIT而不是LANDSCAPE然后它崩溃与以下错误…

 07-30 12:51:37.655: ERROR/AndroidRuntime(22069): FATAL EXCEPTION: main 07-30 12:51:37.655: ERROR/AndroidRuntime(22069): java.lang.RuntimeException: Fail to connect to camera service 07-30 12:51:37.655: ERROR/AndroidRuntime(22069): at android.hardware.Camera.native_setup(Native Method) 07-30 12:51:37.655: ERROR/AndroidRuntime(22069): at android.hardware.Camera.(Camera.java:110) 07-30 12:51:37.655: ERROR/AndroidRuntime(22069): at android.hardware.Camera.open(Camera.java:90) 07-30 12:51:37.655: ERROR/AndroidRuntime(22069): at org.digital.com.CamLayer.surfaceCreated(CamLayer.java:3 

崩溃的方法是……

 public void surfaceCreated(SurfaceHolder holder) { synchronized(this) { mCamera = Camera.open(); Camera.Parameters p = mCamera.getParameters(); p.setPreviewSize(800, 480); mCamera.setParameters(p); try { mCamera.setPreviewDisplay(holder); } catch (IOException e) { Log.e("Camera", "mCamera.setPreviewDisplay(holder);"); } mCamera.startPreview(); mCamera.setPreviewCallback(this); } } 

它崩溃在mCamera = Camera.open();

我的清单文件有

我该如何解决这个问题,以便在Portrait中查看我的应用程序?

作为参考,这是我在我的应用程序中使用的SurfaceHolderCallBack内部类,它在纵向模式下在Nexus One 2.2上正常工作 – 希望它有所帮助。

编辑:“哪个工作”=“哪个不崩溃”。 虽然我还没弄清楚如何正确旋转预览图像(请参阅上面的第一条评论)。 这就是为什么我实际上不得不使用横向和’转换’围绕预览表面的UI内容到横向模式。 Afaik预览(正确旋转预览图像)仅适用于横向模式。 我试过的旋转和定向参数根本没用。

 class SurfaceHolderCallback implements SurfaceHolder.Callback { private static final int IMAGE_WIDTH = 512; private static final int IMAGE_HEIGHT = 384; private static final String ORIENTATION = "orientation"; private static final String ROTATION = "rotation"; private static final String PORTRAIT = "portrait"; private static final String LANDSCAPE = "landscape"; public void surfaceCreated(SurfaceHolder holder) { try { // This case can actually happen if the user opens and closes the camera too frequently. // The problem is that we cannot really prevent this from happening as the user can easily // get into a chain of activites and tries to escape using the back button. // The most sensible solution would be to quit the entire EPostcard flow once the picture is sent. camera = Camera.open(); } catch(Exception e) { finish(); return; } //Surface.setOrientation(Display.DEFAULT_DISPLAY,Surface.ROTATION_90); Parameters p = camera.getParameters(); p.setPictureSize(IMAGE_WIDTH, IMAGE_HEIGHT); camera.getParameters().setRotation(90); Camera.Size s = p.getSupportedPreviewSizes().get(0); p.setPreviewSize( s.width, s.height ); p.setPictureFormat(PixelFormat.JPEG); p.set("flash-mode", "auto"); camera.setParameters(p); try { camera.setPreviewDisplay(surfaceHolder); } catch (Throwable ignored) { Log.e(APP, "set preview error.", ignored); } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (isPreviewRunning) { camera.stopPreview(); } try { camera.startPreview(); } catch(Exception e) { Log.d(APP, "Cannot start preview", e); } isPreviewRunning = true; } public void surfaceDestroyed(SurfaceHolder arg0) { if(isPreviewRunning && camera != null) { if(camera!=null) { camera.stopPreview(); camera.release(); camera = null; } isPreviewRunning = false; } } } 

平台中存在一些并发问题: http : //code.google.com/p/android/issues/detail?id = 6201

解决方法是在释放cam之前清除回调,这是我建议遵循清理代码:

  @Override public void surfaceDestroyed(SurfaceHolder holder) { if (mCam != null) { mCam.stopPreview(); mCam.setPreviewCallback(null); mCam.release(); mCam = null; } } 

你在AndroidManifest.xml中有这个设置吗?

 uses-permission android:name="android.permission.CAMERA" 

而不是使用:

  

尝试使用:

  

并且不要忘记添加相机的权限:

  

我看到您已将预览区域设置为800 x 480.在纵向模式下,此大小无效,并且API中可能存在导致其崩溃的错误。

尝试设置200×200的预览区域

我认为你的问题是当你旋转相机时它没有正确释放或根本没有释放。 如果从landscape切换到portrait ,则会再次启动Intent。 如果此时相机未释放并重新打开,则尝试打开已打开的相机,这会引发错误。

如果您使用的是Android模拟器,则另一种可能是Android虚拟设备设置中的前置和后置摄像头被定义为“无”。

这可能有用……

  @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d("surfaceDestroyed", ""); cameraSource.stop(); //check if you have this line }