改善Android相机预览

时间:2013-07-25 23:55:53

标签: android android-camera surfaceview

我创建了一个使用surfaceView来显示相机预览的应用。我在开发者控制台中收到了很多报告,其中有一些错误在surfaceChanged部分:

     @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上运行良好。 有人能给出一种更稳定可靠的表面变化方法来避免这种错误吗?

2 个答案:

答案 0 :(得分:3)

  

java.lang.IndexOutOfBoundsException(第129行)

随机选择第四个预览尺寸,认为它神奇地总是存在并且总是“480h x 720w”,不会起作用。迭代预览大小并选择所需的大小。

  

java.lang.NullPointerException(第127行)

mCamera显然是null

  

java.lang.RuntimeException:set display orientation failed

不知道在这里告诉你什么。它可能与前置摄像头和后置摄像头相关联,因为角度的解释不同。给定一个degrees变量保存0,90,180或270(匹配Surface.ROTATION_0等值),以及一个名为Camera.Info的{​​{1}},我使用以下内容在CWAC-Camera中:

info

我从the JavaDocs for setDisplayOrientation()中取出了它。

答案 1 :(得分:2)

我无法100%确定导致NullPointerException的原因。如果有一个带有mCamera的NPE,那么第128行也应该出错。错误是在不同时间发生的吗?

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

RuntimeException可能与第一个有关。

我建议您查看CommonsWare的CWAC-Camera库,它会为您处理许多这些事情(通常Android上的Camera API难以使用):https://github.com/commonsguy/cwac-camera