2

我正在开发一个用 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)在应用程序第一次启动时 Instatiating CameraCaptureDialog 以便它可以获得一些内存。

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

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

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

5) 将 cameraDialog.Resolution 减少到 320 x 240。

没有任何效果。我花了很长时间将这个功能添加到我的应用程序中,现在我发现它有时只真正起作用。Windows Mobile 可能非常烦人。帮助!!

4

3 回答 3

1

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

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

于 2012-06-13T13:50:29.813 回答
0

这是打破的原因是因为这条线

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

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

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

如果您设置其中一种分辨率,它可以正常工作。(我在 CN51 上测试并使用 112x160)。

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

如果您希望图像始终保持一定大小;不要设置分辨率->拍照->然后将图像后处理成更小的东西。使用类似这样的一些重新调整大小的示例

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

于 2014-10-20T19:04:51.070 回答
0

我想我已经找到了某种答案。

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

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

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

更新

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

进一步更新:

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

于 2012-06-15T06:28:37.697 回答