【问题标题】:Camera.setPreviewDisplay() throws Exception [duplicate]Camera.setPreviewDisplay() 抛出异常 [重复]
【发布时间】:2009-06-26 11:58:27
【问题描述】:

可能重复:
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)。

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

谢谢!`

【问题讨论】:

  • 不,乔纳森,这不是重复的问题。一是宽高参数不正确,二是设置类型时API不一致。

标签: android camera


【解决方案1】:

我完全同意乔恩·布莱特的观点

我一星期都搞不清楚发生了什么,我忽略了表面支架上的 setType,因为 SDK 说它已被弃用,即。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      相关资源
      最近更新 更多