C# Windows Phone 8 can´;不要第二次调用AudioVideoCaptureDevice
在我的应用程序中,你可以打开一个网站,在那里你可以打开和关闭手电筒。 第一次工作时,但如果我再次尝试打开手电筒,应用程序就会崩溃C# Windows Phone 8 can´;不要第二次调用AudioVideoCaptureDevice,c#,windows-phone-8,flashlight,C#,Windows Phone 8,Flashlight,在我的应用程序中,你可以打开一个网站,在那里你可以打开和关闭手电筒。 第一次工作时,但如果我再次尝试打开手电筒,应用程序就会崩溃 我认为这是AudioVideoCaptureDevice.OpenAsync的问题。如果我第二次调用它,应用程序将与System.Reflection.TargetInvocationException WinRT Information一起崩溃en:无法获取相机。只能在前台使用此类 有人知道这个问题吗 protected AudioVideoCaptureDevi
我认为这是AudioVideoCaptureDevice.OpenAsync的问题。如果我第二次调用它,应用程序将与System.Reflection.TargetInvocationException WinRT Information一起崩溃en:无法获取相机。只能在前台使用此类 有人知道这个问题吗
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";
}
}
我建议在页面生命周期中使用OpenAsync一次性初始化相机,例如在
OnNavigatedTo
事件中。并且仅使SetProperty()
方法调用复选框事件中的代码来控制灯光。另外,通过调用device.dispose()
,在OnNavigatedFrom
事件中正确处理摄像头然后离开页面也是非常重要的。此选项还可以使您的手电筒工作更快
请记住,Windows Phone 8.1现在为torch提供了专用的API,它工作得很好,代码也更漂亮。也可以在Silverlight项目中使用,但必须迁移项目。这里有更多关于这个和 您是否可以尝试避免对AudioVideoCaptureDevice.OpenAsync的第二次调用,并维护对此.Device的引用以重新利用它?