我正在尝试在自定义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
)。
有谁知道什么可能是错的?我非常感谢你的任何帮助。
谢谢!`
答案 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()
一次,则另一个答案中的代码段有效。