2015-01-10 3 views
3

Я пытаюсь работать приложение фонарик через TorchControl класса в приложении Windows Phone: Вот мой кодфонарик App сбой каждый раз

private static async Task<DeviceInformation> GetCameraID(Windows.Devices.Enumeration.Panel desiredCamera) 
    { 
     DeviceInformation deviceID = (await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture)) 
      .FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == desiredCamera); 
     if (deviceID != null) return deviceID; 
     else throw new Exception(string.Format("Camera {0} doesn't exist", desiredCamera)); 
    } 


    async private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var cameraID = await GetCameraID(Windows.Devices.Enumeration.Panel.Back); 
     var mediaDev = new MediaCapture(); 
     await mediaDev.InitializeAsync(new MediaCaptureInitializationSettings 
     { 
      StreamingCaptureMode = StreamingCaptureMode.Video, 
      PhotoCaptureSource = PhotoCaptureSource.VideoPreview, 
      AudioDeviceId = String.Empty, 
      VideoDeviceId = cameraID.Id 
     }); 
     var videoDev = mediaDev.VideoDeviceController; 
     var tc = videoDev.TorchControl; 
     if (tc.Supported)   
      tc.Enabled = true; 
     mediaDev.Dispose();   
    } 

Но проблема заключается в том, что сбой приложения каждый раз, когда я нажимаю на кнопку второй время. Мне сказали использовать метод mediaDev.Dispose(), но он также не работает. Вот исключение:

первого шанса исключение типа «System.Exception» произошло в mscorlib.ni.dll WinRT информации: текст, связанный с этой ошибкой код не может быть найден.

  • Это показывает, а текст в "initializeasync" подсвечивается

    Пожалуйста, помогите. Благодарю.

+1

Какое исключение? – Sievajet

+0

«Первое исключение исключения типа« System.Exception »произошло в mscorlib.ni.dll Информация WinRT: текст, связанный с этим кодом ошибки, не найден." - Это отображается, пока текст в «initializeasync» подсвечивается. – Prajjwal

+0

. Рассмотрите возможность редактирования сообщения, чтобы ввести эти данные. – theMayer

ответ

1

Эта проблема может быть связана с многопоточностью: с использованием значений по умолчанию (т.е. не меняя SynchronizationContext) вызовы await продолжат методы другого потока, то, что не всегда поддерживается графическими и медиабиблиотеками (я имею из первых рук опыт работы с SFML, WPF и AutoCAD очень радует, чтобы назвать несколько). В то время как наличие метода InitializeAsync указывает на иное, убедитесь, что удаление не должно происходить в основном потоке или таком.

2

MediaCapture выдаст исключение, если оно будет повторно инициализировано. Чтобы решить эту проблему, просто убедитесь, что не инициализируют MediaCapture дважды при переходе на страницу камеры или при нажатии кнопки камеры.

MediaCapture mediacapture = new MediaCapture(); 
    bool initialized; 
    protected async override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     if (initialized == false) 
     { 
      var cameraID = await GetCameraID(Windows.Devices.Enumeration.Panel.Back); 
      await mediacapture.InitializeAsync(new MediaCaptureInitializationSettings 
      { 
       StreamingCaptureMode = StreamingCaptureMode.Video, 
       PhotoCaptureSource = PhotoCaptureSource.Photo, 
       AudioDeviceId = string.Empty, 
       VideoDeviceId = cameraID.Id 
      }); 
     } 
     //Selecting Maximum resolution for Video Preview 
     var maxPreviewResolution = mediacapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoPreview).Aggregate((i1, i2) => (i1 as VideoEncodingProperties).Height > (i2 as VideoEncodingProperties).Height ? i1 : i2); 
     //Selecting 4rd resolution setting 
     var selectedPhotoResolution = mediacapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.Photo).ElementAt(3); 
     await mediacapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo, selectedPhotoResolution); 
     await mediacapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoPreview, maxPreviewResolution); 
     // in my .xaml <CaptureElement Name="viewfinder" /> 
     viewfinder.Source = mediacapture; 
     mediacapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees); 
     await mediacapture.StartPreviewAsync(); 
     initialized = true; 
    } 

Кроме того, убедитесь, что камера останавливается предпросмотра, прежде чем перейти на другую страницу, или перед камерой начинается предварительный просмотр снова. Нет необходимости утилизировать MediaCapture.

private async void GoBack_Click(object sender, RoutedEventArgs e) 
    {  
     await mediacapture.StopPreviewAsync(); 
     this.Frame.Navigate(typeof(MainPage)); 
     //Not needed 
     //mediacapture.Dispose(); 
    } 

GetCameraID метод кредит блога Romasz в. http://www.romasz.net/how-to-take-a-photo-in-windows-runtime/

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