0

我制作了一个使用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 上运行良好。有人可以提供更稳定可靠的表面更改方法以避免此类错误吗?

4

2 回答 2

3

java.lang.IndexOutOfBoundsException(第 129 行)

随机选择第四个预览尺寸,认为它神奇地总是存在并且总是“480h x 720w”,是行不通的。迭代预览尺寸并选择您想要的尺寸。

java.lang.NullPointerException(第 127 行)

mCameranull,显然。

java.lang.RuntimeException:设置显示方向失败

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

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);

我从JavaDocs 中提取了setDisplayOrientation().

于 2013-07-26T00:06:41.937 回答
2

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

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

RuntimeException 可能与第一个有关。

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

于 2013-07-26T00:06:14.933 回答