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的引用以重新利用它?