CameraCaptureDialog失败,出现“未知错误”
我正在使用C#编写的Windows Mobile 6.1应用程序。我最近添加了拍照功能。该设备是Intermec CN50。如果我打开我的应用程序并直接转到拍摄照片的位,此代码正常工作。但是,如果我经历了其他几个屏幕,然后打开照片位,它会失败并显示非常有用的消息“发生未知错误”。在我能看到的例外中没有其他有用的信息。CameraCaptureDialog失败,出现“未知错误”
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)Instatiating CameraCaptureDialog当应用程序第一次启动,以便它可以获得一些内存。
2)Instatiating CameraCaptureDialog并在应用第一次启动时调用ShowDialog()。
3)在实例化CameraCaptureDialog(这是在论坛上建议的)之前,关闭与本地SQL CE数据库的连接。
4)在实例化之前运行GC.Collect()(是的,我知道这通常不是一个好主意)。
5)由240
没有减少cameraDialog.Resolution只是320工程。我花了很多年在我的应用程序中添加这个功能,现在我发现它实际上只是有时候有效。 Windows Mobile可能会非常烦人。帮帮我!!
我认为我找到了某种答案。
1)我添加了代码来关闭到本地SQL CE数据库的全局连接。这是在论坛上提出的。
2)我还添加了代码来处理我的条形码对象,正如tcarvin所建议的。不过,我偶尔还是遇到了这个错误。
3)然后我注意到,错误似乎只在我连接到Visual Studio的设备进行调试时出现。如果我以普通用户使用它的方式使用它,那么它看起来没问题。我当然希望如此反正...
UPDATE
现在应用程序已经部署到客户似乎问题仍然发生。此外,有时他们能够加载相机屏幕并拍摄照片,但Windows出现一条消息,指出“错误无法加载文件”或类似的东西。它们重新启动应用程序,然后运行,但我不能指望他们每次想要拍照时都这样做。我会看看Intermec公司可以帮助...
进一步更新:
这件事发生前一阵子,所以我对我现在找到了解决办法有点模糊。我实际上已经离开了那个工作,现在不能看代码。最后,我从Intermec那里得到了一个组件(我认为是一个DLL),它解决了这个问题。
虽然不在CN50上,但我在不同的Intermec设备上遇到了类似的问题。事实证明,由于条码扫描器/解码器和相机共享一个共同的基础设施,所以他们不能同时被访问。
尝试评论或嘲笑你的条形码对象,看看你是否可以在浏览你的应用程序后使用相机。
非常感谢您的建议!我已经添加了代码来执行此操作。我不确定它是否完全解决了问题。我仍在测试东西。 –
之所以这样,是破是因为该行
cameraDialog.Resolution = new Size(640, 480);
不要设置的摄像头不支持的分辨率 - 它会当你做的ShowDialog()失败
支持的分辨率可通过运行找到图片&视频应用程序>菜单>选项>分辨率下拉。
如果你设置其中一个解决方案,它工作正常。 (我正在测试CN51并使用112x160)。
- 设备的支持的分辨率是一些注册表设置的地方,并从它的设备到设备的不同。如果您的代码假设在多个设备上运行,则处理此问题的最佳方法是不要设置分辨率(它将使用最后使用的或设备默认的设置)。
如果你想图像总是有一定的大小;不要设置分辨率 - >拍摄照片 - >然后将图像后处理为更小的图像。使用这样的事情some re-size example
希望这可以帮助别人的未来。
你有没有找到解决方案?我有一个类似的问题,它驱使我们的开发者疯狂... –