我正在使用C#编写的Windows Mobile 6.1应用程序。我最近添加了拍照的功能。该设备是Intermec 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)将cameraDialog.Resolution降低到320×240。
没有任何作用。我花了很多年才将这个功能添加到我的应用程序中,现在我发现它实际上只是有效。 Windows Mobile可能会非常烦人。帮助!
答案 0 :(得分:1)
虽然不在CN50上,但我在另一台Intermec设备上遇到了类似的问题。事实证明,因为条形码扫描仪/解码器和相机共享一个共同的基础设施,所以不能同时访问它们。
尝试评论或嘲笑您的条形码对象,看看您是否可以在导航应用后使用相机。
答案 1 :(得分:0)
我认为我找到了某种答案。
1)我添加了代码以关闭与本地SQL CE数据库的全局连接。这是在一个论坛上提出的。
2)我还添加了代码来处理tcarvin建议的条形码对象。但是偶尔我还是会遇到这个错误。
3)然后我注意到当我使用连接到Visual Studio的设备进行调试时,似乎只出现了错误。如果我以普通用户使用它的方式使用它,那么它似乎没问题。无论如何我当然希望......
更新
现在应用程序已部署到客户,似乎问题仍在发生。此外,有时他们可以加载相机屏幕并拍照,但Windows会出现一条消息,说明"错误无法加载文件"或类似的东西。它们重新启动应用程序然后它可以工作,但我不能指望他们每次想要拍照时都这样做。我会看看Intermec是否可以提供帮助......
进一步更新:
这发生在不久前,所以我对现在找到的解决方案有点模糊。我实际上离开了这份工作,现在无法查看代码。最后,我得到了Intermec的一个compononet(我认为是一个DLL)解决了这个问题。
答案 2 :(得分:0)
之所以破坏是因为这条线
cameraDialog.Resolution = new Size(640, 480);
不要设置相机不支持的分辨率 - 当你执行ShowDialog()
时它会失败支持的分辨率可以通过运行Picture& amp;视频应用>菜单>选项>决议下降。
如果您设置其中一个分辨率,它可以正常工作。 (我在CN51上测试并使用了112x160)。
- 支持的设备分辨率是某些注册表设置,它与设备不同。如果您的代码假设在多个设备上运行,则处理此问题的最佳方法是不设置分辨率(它将使用最后使用的内容或设备默认设置)。
如果你想让图像总是那么大;不要设置分辨率 - >拍照 - >然后将图像后处理为更小的图像。使用类似some re-size example
的内容希望这可以帮助将来的某个人。