2012-06-13 3 views
2

Я работаю над приложением Windows Mobile 6.1, написанным на C#. Недавно я добавил возможность делать фотографии. Устройство представляет собой 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) Instationing CameraCaptureDialog, когда приложение запускается, поэтому оно может получить некоторую память.

2) Instationing CameraCaptureDialog, а также вызов ShowDialog() при первом запуске приложения.

3) Закрытие моего подключения к локальной базе данных SQL CE до создания экземпляра CameraCaptureDialog (это было предложено на форуме).

4) Запуск GC.Collect() перед созданием экземпляра (да, я знаю, что это обычно не хорошая идея).

5) Снижение cameraDialog.Resolution до всего 320 на 240.

ничего не работает. Я потратил годы, добавляя эту функциональность в свое приложение, и теперь я нахожу, что он работает только на самом деле. Windows Mobile может быть очень раздражающим. Помогите!!

ответ

0

Я думаю, что нашел какой-то ответ.

1) Я добавил код, чтобы закрыть мое глобальное подключение к локальной базе данных SQL CE. Это было предложено на форуме.

2) Я также добавил код для размещения объекта штрихового кода, как предложено tcarvin. Однако время от времени я все еще испытывал ошибку.

3) Затем я заметил, что ошибка, похоже, возникает, когда я отлаживаю устройство, подключенное к Visual Studio. Если я использую его так, как обычный пользователь будет его использовать, тогда все будет хорошо. Я, конечно, надеюсь, что так или иначе ...

UPDATE

Теперь приложение было развернуто на клиентов, кажется, что проблема все еще происходит. Кроме того, иногда они могут загружать экран камеры и делать снимок, но в Windows появляется сообщение «Ошибка не может загрузить файл» или что-то подобное. Это они перезапускают приложение, а затем работают, но я не могу ожидать, что они будут делать это каждый раз, когда они захотят сделать снимок.Я буду видеть, если Intermec может помочь ...

ДАЛЕЕ UPDATE:

Это произошло некоторое время назад, так что я немного расплывчатым о решении я нашел в настоящее время. Я действительно оставил эту работу и теперь не могу смотреть на код. В конце концов я получил компонентную систему (я думаю, DLL) от Intermec, которая решила проблему.

+0

Вы когда-нибудь находили решение? У меня такая же проблема, и это заставляет наших разработчиков безумных ... –

1

Хотя не на CN50, я столкнулся с аналогичной проблемой на другом устройстве Intermec. Оказалось, что из-за того, что сканер/декодер штрих-кода и камера совместно используют общую инфраструктуру, к которой они не должны одновременно обращаться.

Попробуйте прокомментировать или издеваться над объектами штрих-кода и посмотреть, сможете ли вы использовать камеру после навигации по вашему приложению.

+0

Большое спасибо за предложение! Я добавил код для этого. Я не уверен, полностью ли он решил проблему или нет. Я все еще проверяю вещи. –

0

Причина, почему это нарушение из-за этой линии

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

Dont установить разрешение камеры не поддерживает - это потерпит неудачу, когда вы делаете ShowDialog()

Поддерживаемые разрешения могут можно найти при запуске Picture & video App> menu> options> Resolutions drop down.

Если вы установили одно из этих разрешений, оно отлично работает. (Я тестирую CN51 и использую 112x160).

- Поддерживаемые разрешения устройства - это какой-то параметр реестра и его отличие от устройства к устройству. Если ваш код предполагает работать на нескольких устройствах, лучший способ справиться с этим - не устанавливать разрешение (он будет использовать все, что использовалось последним или считается по умолчанию для устройства).

Если вы хотите, чтобы изображения всегда были определенного размера; Не устанавливайте разрешение -> снимите изображение -> затем выполните обработку изображения на что-то меньшее. Используя что-то вроде этого some re-size example

Надеюсь, это поможет кому-то в будущем.

Смежные вопросы