Camera.setPreviewDisplay()抛出异常

时间:2009-06-26 11:58:27

标签: android camera

  

可能重复:
  Android Camera will not work. startPreview fails

我正在尝试在自定义SurfaceView中设置相机预览,但每次执行初始化方法时都会出现异常。

以下是相机预览初始化的代码:

private void init(Context context)
{
    setFocusable(true);
    mRecording = false;
    fileRW = new FileReaderWriter();
    frameCount = 0;
    if(mCamera == null)
    {
        mCamera = Camera.open();
    }
    Parameters parameters = mCamera.getParameters();
    parameters.setPictureFormat(PixelFormat.JPEG);
    mCamera.setParameters(parameters);
    try {
        mCamera.setPreviewDisplay(surfaceHolder);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    mCamera.startPreview();

}

每次尝试执行该方法时,行mCamera.setPreviewDisplay(surfaceHolder);都会抛出异常(setPreviewDisplay failed)。

有谁知道什么可能是错的?我非常感谢你的任何帮助。

谢谢!`

2 个答案:

答案 0 :(得分:7)

我完全赞同Jon Bright

我无法弄清楚一周发生了什么,我忽略了表面支架上的setType,因为SDK说它已被弃用,即。

  

“不推荐使用此方法。忽略此方法,此值在需要时自动设置。”

但如果你不这样做,它会在setPreview上崩溃。这是在带有2.1的Galaxy S上运行1.5 SDK(我需要它向后兼容)。因此,请确保您设置类型。不像文档那样自动发声。

答案 1 :(得分:2)

调用setPreviewDisplay()的最佳位置在surfaceChanged()如果表面刚刚创建,则SurfaceChanged将至少被调用一次,您可以在那里startPreview()和setPreviewDisplay。如果曲面发生变化并且预览已经开始,那么您可以stopPreview/setPreviewDisplay/startPreview。即使您的应用不会更改表面的大小,当应用程序因方向更改而启动或退出时,框架仍可能会意外地调用surfaceChanged()。所以你的应用程序确实需要正确处理surfaceChanged。您可以在Android中跟踪相机应用程序的源代码以供参考。

如果在应用生命周期中仅调用surfaceChanged()一次,则另一个答案中的代码段有效。