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)每次我尝试执行该方法时,code>都会引发异常(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不一致。