2010-07-30 189 views
12

我有我的相机设置为​​,它工作正常,但如果我把它更改为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.<init>(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();

我的清单文件有<uses-permission android:name="android.permission.CAMERA"></uses-permission>

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

+1

你在使用什么设备以及SDK版本是什么? Afaik相机预览只能在横向模式下正常工作,但在纵向模式下正常工作。我也想用肖像模式(在N1上,在三星Galaxy S上)使用它,但没有成功。另请参阅http://code.google.com/p/android/issues/detail?id=1193上的错误跟踪器;虽然我从来没有像你上面提到的错误。 – 2010-08-01 14:45:51

+0

我使用的是Nexus One 2.2 – Skizit 2010-08-01 16:47:57

+0

您是否有其他设备进行测试?它在模拟器中工作吗?如果它是一个小apk,我可以帮你在我的N1和Galaxy S上测试它。你的2.2是最后的2.2 FRF91? – 2010-08-03 11:24:31

回答

16

预览区域供您参考,这是我用我的应用程序的SurfaceHolderCallBack内部类和其在纵向模式下在Nexus One 2.2工作正常 - 希望它帮助。

编辑:“which works”=“它不会崩溃”。虽然我还没有想出如何正确旋转预览图像(请参阅上面的第一条评论)。这就是为什么我实际上不得不使用横向和'转换'的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; 
     } 
    } 
} 
+0

Mathias Lin ...你能帮我关于http://stackoverflow.com/questions/26714771/android-camera-take-picture-failed-issue – koutuk 2014-11-04 05:49:12

+0

你在哪里实现了完成方法(在catch块中)以及它做了什么? – 2016-05-31 10:37:44

13

你是否在AndroidManifest.xml中有这个集合?

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

是的,我有这样的设置。 – Skizit 2010-07-31 12:07:48

+2

感谢您发布此内容,即使它很明显,对于搜索此内容的人(如我)来说,这是一个有用的提示。 – Dimitris 2013-09-15 22:56:37

+0

Romain Hippeau ...你可以请帮助我关于http://stackoverflow.com/questions/26714771/android-camera-take-picture-failed-issue – koutuk 2014-11-04 05:47:37

0

我看你已经设置你的预览区域设置为800 x 480的在纵向模式下,这个尺寸是无效的,并可能有这使得它崩溃API中的错误。

尝试设置的200×200

+1

我试着在上面的代码示例800x480 previewSize以及工作好吧Nexus One 2.2。实际上,调用时,您在N1上获得的默认大小为800x480:p.getSupportedPreviewSizes()。get(0); - 因此这是一个正确的预览大小。 – 2010-08-02 06:16:25

+0

是的,这不能解决任何问题。它打破了我的参数。 – Skizit 2010-08-02 11:20:52

+1

你必须找到最佳预览尺寸得到所有尺寸比较,并获得最大的一个,它会工作, – Toshe 2012-01-31 10:09:40

24

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

解决办法是释放凸轮之前清除回调,这是我会建议以下清理代码:

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

Kangur ...可以请你帮我关于http://stackoverflow.com/questions/26714771/android-camera-take-picture-failed-issue – koutuk 2014-11-04 05:48:09

+0

对不起,我从3年以来一直没有去过..没想法它现在如何工作:) – Kangur 2014-12-22 08:12:40

0

我想你的问题是,当你旋转相机时,它不能正确释放或根本不释放。如果您从landscape切换到portrait,则该意向会再次启动。如果相机未被释放并重新打开,请尝试打开已打开的相机,该相机会引发错误。

2

而不是使用:

<uses-permission 
    android:name="android.permission.FLASHLIGHT"/> 

尝试使用:

<uses-permission 
    android:name="android.permission.FLASHLIGHT" 
    android:permissionGroup="android.permission-group.HARDWARE_CONTROLS" 
    android:protectionLevel="normal" /> 

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

<uses-permission android:name="android.permission.CAMERA" /> 
+0

它似乎帮助我在Nexus 7(Android 5.0)上。额外的'group'和'level'线的含义是什么? – 2014-12-26 13:17:53

0

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