Android setPreviewDisplay()引发异常

Android setPreviewDisplay()引发异常,android,camera,Android,Camera,可能重复: 我试图在自定义SurfaceView中设置相机预览,但每次执行初始化方法时都会出现异常 以下是相机预览初始化的代码: private void init(Context context) { setFocusable(true); mRecording = false; fileRW = new FileReaderWriter(); frameCount = 0; if(mCamera == null) { mCam

可能重复:

我试图在自定义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失败

有人知道会出什么问题吗?我非常感谢你的任何帮助


谢谢`

调用
setPreviewDisplay()
的最佳位置是在曲面刚创建时,至少会调用一次surfaceChanged,您可以
startPreview()
并在那里设置PreviewDisplay。如果曲面发生更改且预览已开始,则可以在此处
停止预览/setPreviewDisplay/startPreview
。即使您的应用程序没有更改曲面的大小,当应用程序由于方向更改而启动或退出时,框架仍可能意外调用
surfacechange()
。因此,你的应用程序确实需要正确处理surfaceChanged。您可以在Android中跟踪摄像头应用程序的源代码以供参考


如果在应用程序生命周期中只调用一次
surfaceChanged()
,那么另一个答案中的代码片段就可以工作。

我完全同意Jon Bright的观点

我一个星期都搞不清楚到底发生了什么,我忽略了surface holder上的setType,因为SDK说它不推荐使用,即

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


但如果不这样做,它将在setPreview上崩溃。这是运行1.5 SDK(我需要它向后兼容),在银河S与2.1。所以一定要设置类型。不像文档所说的那样自动化。

不,乔纳森,这不是重复的问题。一个原因是宽度/高度参数不正确,另一个原因是设置类型时API不一致。