2014-01-05 1 views
4

В моем приложении вы можете открыть сайт, на котором вы можете включать и выключать фонарик. В первый раз, когда он работает, но если я попытаюсь переключить фонарик во второй раз, приложение сработает.Windows Phone 8 не может вызывать AudioVideoCaptureDevice второй раз


Я думаю, что это проблема с AudioVideoCaptureDevice.OpenAsync. Если я назову это во второй раз, приложение перестанет работать с System.Reflection.TargetInvocationException WinRT-Informationen: невозможно получить камеру. Вы можете использовать этот класс только на переднем плане.

Кто-нибудь знает эту проблему?

protected AudioVideoCaptureDevice Device { get; set; } 

public Page10() 
{ 
    InitializeComponent(); 
} 

async void tglSwitch_Checked(object sender, RoutedEventArgs e) 
{ 
    var sensorLocation = CameraSensorLocation.Back; 
    if (this.Device == null) 
    { 
     // get the AudioVideoCaptureDevice 
     this.Device = await AudioVideoCaptureDevice.OpenAsync(sensorLocation, 
     AudioVideoCaptureDevice.GetAvailableCaptureResolutions(sensorLocation).First()); 
    } 
    var supportedCameraModes = AudioVideoCaptureDevice 
     .GetSupportedPropertyValues(sensorLocation, KnownCameraAudioVideoProperties.VideoTorchMode); 
    if (supportedCameraModes.ToList().Contains((UInt32)VideoTorchMode.On)) 
    { 
     this.Device.SetProperty(KnownCameraAudioVideoProperties.VideoTorchMode, VideoTorchMode.On); 

     // set flash power to maxinum 
     this.Device.SetProperty(KnownCameraAudioVideoProperties.VideoTorchPower, 
      AudioVideoCaptureDevice.GetSupportedPropertyRange(sensorLocation, KnownCameraAudioVideoProperties.VideoTorchPower).Max); 

     this.tglSwitch.Content = "Light on"; 
     this.tglSwitch.SwitchForeground = new SolidColorBrush(Colors.Green); 
    } 
} 

void tglSwitch_Unchecked(object sender, RoutedEventArgs e) 
{ 
    var sensorLocation = CameraSensorLocation.Back; 
    sensorLocation = CameraSensorLocation.Back; 
    var supportedCameraModes = AudioVideoCaptureDevice 
     .GetSupportedPropertyValues(sensorLocation, KnownCameraAudioVideoProperties.VideoTorchMode); 
    if (this.Device != null && supportedCameraModes.ToList().Contains((UInt32)VideoTorchMode.Off)) 
    { 
     this.Device.SetProperty(KnownCameraAudioVideoProperties.VideoTorchMode, VideoTorchMode.Off); 
     this.tglSwitch.Content = "Light off"; 
    } 
} 
+0

Можете ли вы попытаться избежать второго вызова AudioVideoCaptureDevice.OpenAsync, поддерживающего ссылку на this.Device, чтобы повторно использовать его? – marianosz

ответ

0

Я рекомендовал бы инициализировать камеру с OpenAsync ОДНОВРЕМЕННО на странице жизненного цикла, например, в случае OnNavigatedTo. И только make SetProperty() методов вызывает код в ваших флажках, чтобы контролировать свет. Также очень важно правильно распоряжаться камерой, а затем покинуть страницу, например, в событии OnNavigatedFrom, позвонив по телефону device.Dispose(). Этот параметр также заставит ваш фонарик работать быстрее.

Имейте в виду, что Windows Phone 8.1 теперь имеет выделенный API для факела, который отлично работает и код более красив. Вы также можете использовать в проекте Silverlight, но вы должны перенести свой проект. Вот об этом http://developer.nokia.com/community/wiki/Using_the_camera_light_in_Windows_Phone_7,_8_and_8.1 и https://msdn.microsoft.com/en-us/library/windows/apps/windows.media.devices.torchcontrol.