CameraCaptureDialog失败,出现“未知错误”

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),它解决了这个问题。

+0

你有没有找到解决方案?我有一个类似的问题,它驱使我们的开发者疯狂... –

虽然不在CN50上,但我在不同的Intermec设备上遇到了类似的问题。事实证明,由于条码扫描器/解码器和相机共享一个共同的基础设施,所以他们不能同时被访问。

尝试评论或嘲笑你的条形码对象,看看你是否可以在浏览你的应用程序后使用相机。

+0

非常感谢您的建议!我已经添加了代码来执行此操作。我不确定它是否完全解决了问题。我仍在测试东西。 –

之所以这样,是破是因为该行

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

不要设置的摄像头不支持的分辨率 - 它会当你做的ShowDialog()失败

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

如果你设置其中一个解决方案,它工作正常。 (我正在测试CN51并使用112x160)。

- 设备的支持的分辨率是一些注册表设置的地方,并从它的设备到设备的不同。如果您的代码假设在多个设备上运行,则处理此问题的最佳方法是不要设置分辨率(它将使用最后使用的或设备默认的设置)。

如果你想图像总是有一定的大小;不要设置分辨率 - >拍摄照片 - >然后将图像后处理为更小的图像。使用这样的事情some re-size example

希望这可以帮助别人的未来。