4

可能重复:
Android 相机无法工作。开始预览失败

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

有谁知道可能出了什么问题?我非常感谢您的任何帮助。

谢谢!`

4

2 回答 2

7

我完全同意 Jon Bright

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

“此方法已弃用。此方法被忽略,此值在需要时自动设置。”

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

于 2011-04-09T08:44:54.583 回答
2

最好的调用位置setPreviewDisplay()是在surfaceChanged()如果刚刚创建了表面,surfaceChanged 将至少被调用一次,你可以startPreview()在那里设置预览显示。如果表面发生变化并且预览已经开始,您可以stopPreview/setPreviewDisplay/startPreview在那里。即使你的应用程序没有改变表面的大小,框架仍然可能surfaceChanged()在应用程序启动或退出时由于方向变化而意外调用。所以你的应用确实需要正确处理surfaceChanged。您可以在Android中跟踪相机应用程序的源代码以供参考。

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

于 2009-11-30T06:46:55.130 回答