2013-07-25 98 views
0

我做了一个使用surfaceView显示相机preview.I得到了在开发者控制台,许多报告与surfaceChanged部分错误的应用程序:提高Android摄像头预览

 @Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {  

    Parameters parameters = mCamera.getParameters();     //// (Line 127) 

    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); 

    Camera.Size previewSize = previewSizes.get(4); //480h x 720w  /// (Line 129) 

    parameters.setPreviewSize(previewSize.width, previewSize.height); 
    parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); 
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 

    mCamera.setParameters(parameters); 

    Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    if(display.getRotation() == Surface.ROTATION_0) 
    { 
     parameters.setPreviewSize(height, width);       
     mCamera.setDisplayOrientation(90); 
    } 

    if(display.getRotation() == Surface.ROTATION_90) 
    { 
     parameters.setPreviewSize(width, height);       
    } 

    if(display.getRotation() == Surface.ROTATION_180) 
    { 
     parameters.setPreviewSize(height, width);    
    } 

    if(display.getRotation() == Surface.ROTATION_270) 
    { 
     parameters.setPreviewSize(width, height); 
     mCamera.setDisplayOrientation(180); 
    } 


    mCamera.startPreview(); 
} 

第一个错误:

java.lang.IndexOutOfBoundsException (Line 129) 

第二错误:

java.lang.NullPointerException (Line 127) 

第三误差:

java.lang.RuntimeException: set display orientation failed (when rotating cam 90*) 

大多数的错误报告是从三星Galaxy设备,但应用程序适用于LG的Nexus 4大 能有人给了表面的变化更稳定和可靠的方式来避免这样的错误?

+0

这将有助于显着,如果你能指出哪些行127和129是 –

+0

Derp,我没有看到指出这些线的评论。对不起 –

回答

2

我不能100%确定是什么导致了NullPointerException。如果有mCamera的NPE,那么第128行也应该出错。错误是在不同的时间发生的吗?

IndexOutOfBoundsException很容易解释; Galaxy设备上没有5种预览尺寸可供选择,因此无法找到第5种尺寸并引发异常。

RuntimeException可能与第一个有关。

我建议在看CommonsWare的CWAC-相机库,而不是,它可以处理很多这样的事情对你(一般摄像头API在Android上是很难的工作):https://github.com/commonsguy/cwac-camera

+1

感谢您的信任投票! :-) – CommonsWare

+0

老兄,我现在正在使用你的图书馆,为我正在写的一个自定义Snapchat客户端,它耗费了我几年的时间。相机API是一个很痛苦的工作,就像试图找出SurfaceView拉伸旋转等问题。 –

+0

我应该使用CWAC-Camera src中的哪个文件(SurfacePreviewStartegy或CameraView)请帮助我是初学者java&android – user2558256

3

java.lang.IndexOutOfBoundsException (Line 129)

随机选择第四预览尺寸,认为它奇迹般地始终存在,并且总是“480h x 720w”,不会起作用。迭代预览尺寸并选择你想要的尺寸。

java.lang.NullPointerException (Line 127)

mCameranull,显然。

java.lang.RuntimeException: set display orientation failed

不知道在这里告诉你什么。它可能会与前置摄像头和后置摄像头绑在一起,因为度数的解释不同。给定一个degrees变量保持0,90,180或270(匹配Surface.ROTATION_0等的值),和一个名为infoCamera.Info,我使用在CWAC-Camera以下:

if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
    displayOrientation=(info.orientation + degrees) % 360; 
    displayOrientation=(360 - displayOrientation) % 360; 
} 
else { 
    displayOrientation=(info.orientation - degrees + 360) % 360; 
} 

camera.setDisplayOrientation(displayOrientation); 

我把来自the JavaDocs for setDisplayOrientation()

+0

那么它是否可以通过用我的代码替换你的代码? – user2558256

+0

我只使用后置摄像头 – user2558256