相机捕获对话框失败,并显示“发生未知错误”

本文关键字:未知 错误 显示 对话框 失败 相机 | 更新日期: 2023-09-27 18:36:56

我正在开发一个用C#编写的Windows Mobile 6.1应用程序。我最近添加了拍照功能。该设备是茵腾麦克CN50。如果我打开我的应用程序并直接转到拍照的位,则此代码工作正常。但是,如果我浏览其他几个屏幕,然后打开照片位,它会失败,并显示非常有用的消息"发生未知错误"。在我可以看到的例外中没有其他有用的信息。代码在此行失败:

cameraResult = cameraDialog.ShowDialog();

下面是堆栈跟踪:

at Microsoft.WindowsMobile.Forms.CameraCaptureDialog.LaunchCameraCaptureDialog(IntPtr ptrStruct)
at Microsoft.WindowsMobile.Forms.CameraCaptureDialog.ShowDialog()
at MicronetMobileUi.Controls.Camera.ShowDialog(Form owner, String& fileName)
at MicronetMobileUi.FieldService.JobImagesForm.LoadCameraScreen()
at MicronetMobileUi.FieldService.JobImagesForm.footerToolbar_ItemEntered(Object sender, EventArgs e)
at Resco.Controls.CommonControls.ToolbarControl.OnItemEntered()
at Resco.Controls.CommonControls.ToolbarControl.MouseClickUp(MouseEventArgs e)
at Resco.Controls.CommonControls.ToolbarControl.OnMouseUp(MouseEventArgs e)
at System.Windows.Forms.Control.WnProc(WM wm, Int32 wParam, Int32 lParam)
at System.Windows.Forms.ContainerControl.WnProc(WM wm, Int32 wParam, Int32 lParam)
at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
at Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
at System.Windows.Forms.Application.Run(Form fm)
at MicronetMobileUi.ApplicationManager.StartApp()
at MicronetMobileUi.Program.Main()

代码如下:

var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
var fileName = "temp.jpg";  
var pathAndFileName = Path.Combine(path, fileName);
var cameraDialog = new CameraCaptureDialog();
cameraDialog.Owner = this;
cameraDialog.InitialDirectory = path;
cameraDialog.DefaultFileName = fileName;
cameraDialog.Mode = CameraCaptureMode.Still;
cameraDialog.StillQuality = CameraCaptureStillQuality.Low;
cameraDialog.VideoTimeLimit = new TimeSpan(0, 0, 0);
cameraDialog.VideoTypes = CameraCaptureVideoTypes.Messaging;
cameraDialog.Resolution = new Size(640, 480); 
// open camera dialog to take a photo
DialogResult cameraResult;
try
{
    cameraResult = cameraDialog.ShowDialog();
}
catch (Exception ex)
{
    MessageBox.Show("Grrrr!!");
}       
finally
{
    cameraDialog.Dispose();
    cameraDialog = null;
}
if (cameraResult != DialogResult.OK)
    return; // no photo was taken
// save photo using this value: pathAndFileName ...

我想这与内存不足有关,但我真的不知道。到目前为止,我已经尝试过:

1)在应用程序首次启动时设置CameraCaptureDialog,以便它可以获得一些内存。

2)设置CameraCaptureDialog,并在应用程序首次启动时调用ShowDialog()。

3) 在实例化 CameraCaptureDialog 之前关闭与本地 SQL CE 数据库的连接(这是在论坛上建议的)。

4) 运行 GC。在实例化之前 collect()(是的,我知道这通常不是一个好主意)。

5)将相机对话框的分辨率降低到320×240。

什么都没用。我花了很长时间将此功能添加到我的应用程序中,现在我发现它有时才真正起作用。Windows Mobile可能非常烦人。帮助!!

相机捕获对话框失败,并显示“发生未知错误”

虽然不在 CN50 上,但我在不同的 Intermec 设备上遇到了类似的问题。 事实证明,由于条形码扫描仪/解码器和相机共享一个通用的基础设施,因此不得同时访问它们。

尝试注释掉或模拟条形码对象,看看是否可以在导航应用后使用相机。

我想

我已经找到了某种答案。

1) 我添加了代码以关闭与本地 SQL CE 数据库的全局连接。这是在一个论坛上提出的。

2)我还按照tcarvin的建议添加了代码来处置我的条形码对象。但是,我仍然偶尔遇到错误。

3)然后我注意到错误似乎仅在我使用连接到Visual Studio的设备进行调试时才出现。如果我以普通用户使用它的方式使用它,那么它似乎没问题。无论如何,我当然希望如此...

更新

现在该应用程序已部署到客户,似乎问题仍在发生。此外,有时他们能够加载相机屏幕并拍照,但 Windows 会显示一条消息,指出"错误无法加载文件"或类似内容。如果他们重新启动应用程序,然后它可以工作,但我不能指望他们每次想拍照时都这样做。我会看看Intermec是否可以提供帮助...

进一步更新:

这发生在不久前,所以我对我现在找到的解决方案有点模糊。我实际上已经离开了那份工作,现在无法查看代码。最后,我从Intermec得到了一个解决了这个问题的组件(我认为是一个DLL)。

之所以会中断,是因为这条线

cameraDialog.Resolution = new Size(640, 480);

不要设置相机不支持的分辨率 - 当你执行 ShowDialog() 时它会失败

可以通过运行图片和视频应用程序>菜单>选项找到支持的分辨率>分辨率下拉菜单。

如果您设置了这些分辨率之一,则工作正常。(我正在CN51上测试并使用112x160)。

--设备支持的分辨率是某处的某些注册表设置,并且因设备而异。如果您的代码假设在多个设备上运行,则处理此问题的最佳方法是不设置分辨率(它将使用最后使用的任何内容或被视为设备的默认分辨率)。

如果您希望图像始终是某种大小;不要设置分辨率 ->拍照 ->然后将图像后期处理为更小的图像。使用类似这样的东西来调整大小的示例

希望这对将来的某人有所帮助。