【问题标题】:Improving android camera preview改进 android 相机预览
【发布时间】:2013-07-25 23:55:53
【问题描述】:

我制作了一个使用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 上运行良好。 有人能给出更稳定可靠的表面变化方式来避免此类错误吗??

【问题讨论】:

  • 如果您能指出第 127 行和第 129 行是什么,这将有很大帮助
  • Derp,我没有看到 cmets 指出这些行。对不起

标签: android android-camera surfaceview


【解决方案1】:

java.lang.IndexOutOfBoundsException(第 129 行)

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

java.lang.NullPointerException(第 127 行)

mCamera 显然是null。

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

不知道在这里告诉你什么。它可能与前置摄像头和后置摄像头有关,因为度数的解释不同。给定一个包含 0、90、180 或 270(匹配 Surface.ROTATION_0 等值)的 degrees 变量和一个名为 info 的 Camera.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() 那里提取的。

【讨论】:

  • 我只使用后置摄像头
【解决方案2】:

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

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

RuntimeException 可能与第一个有关。

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

【讨论】:

  • 老兄,我现在正在使用您的库来编写我正在编写的自定义 Snapchat 客户端,但我的生命已经过了好几年。使用相机 API 非常痛苦,比如试图找出 SurfaceView 在旋转时拉伸等问题。
  • 我应该使用 CWAC-Camera src 中的哪个文件(SurfacePreviewStartegy 或 CameraView)请帮助我是 java 和 android 的初学者
  • 您需要使用CameraView。看看 CameraFragment.java,它应该可以帮助您入门
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多