相机设置预览显示(Camera.setPreviewDisplay())抛出异常。

4

可能是重复问题:
Android相机无法工作。startPreview失败

我正在尝试在自定义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)。

有人知道可能是什么问题吗?非常感谢您的帮助。

谢谢!


不,Jonathan,这不是重复的问题。一个是由于不正确的宽度/高度参数,另一个是由于在设置类型时API不一致。 - Syndacate
2个回答

7
我完全同意Jon Bright的看法。
我一开始一个星期都没弄明白是怎么回事,因为SDK说setType已经被弃用了,也就是说:
“这个方法已经被弃用。它会被忽略,当需要时,这个值会自动设置。”
但如果你不这样做,在setPreview时会崩溃。我在Galaxy S上使用1.5 SDK(我需要向后兼容),并运行2.1版本。所以确保你设置了类型。文档描述的并不像那么自动化。

2
在涉及IT技术的内容中,调用setPreviewDisplay()的最佳位置是在surfaceChanged()中。如果表面刚刚创建,surfaceChanged将至少被调用一次,您可以在那里startPreview()并设置预览显示。如果表面发生变化并且预览已经开始,则可以在那里stopPreview/setPreviewDisplay/startPreview。即使您的应用程序不更改表面的大小,框架仍可能在应用程序启动或由于方向更改而退出时意外调用surfaceChanged()。因此,您的应用程序确实需要正确处理surfaceChanged。您可以跟踪Android相机应用程序的源代码作为参考。
另一个答案中的代码片段仅适用于应用程序生命周期中仅调用一次surfaceChanged()的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接