我有一个主页和相机页面的应用程序。 当我用相机去页面时,它开始了,一切正常。 我可以使用设备后退按钮返回主页,然后再转到相机页面,它仍然可以。我还有代码可以在手机进入睡眠状态时关闭相机或应用程序更改其可见性状态并且也可以正常工作(当e.Visible为假时停止相机并在e.Visible为真时启动它。)
当这些事件处于这个序列中时会发生问题(也可能是其他序列,但我没有完全测试它)
1. go to page with camera
2. go back to home page
3. go to page with camera again
4. app lose visibility
5. app is visible again --> crash
下面是事件的代码:
void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
if (!e.Handled && Frame.CurrentSourcePageType.FullName == "MyApp.CamPage")
{
e.Handled = true;
StopCamera();
Frame.Navigate(typeof(Elements));
}
}
private void Current_VisibilityChanged(object sender, Windows.UI.Core.VisibilityChangedEventArgs e)
{
if (Frame.CurrentSourcePageType.FullName == "MyApp.CamPage")
{
if (e.Visible)
{
StartCamera();
}
else
{
StopCamera();
}
}
}
private async void StartCamera()
{
if (mediaCapture == null)
{
// start camera
mediaCapture = new MediaCapture();
DeviceInformation _deviceInformation = (await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture)).FirstOrDefault(d => d.EnclosureLocation != null && d.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back);
var settings = new MediaCaptureInitializationSettings();
if (_deviceInformation != null)
settings.VideoDeviceId = _deviceInformation.Id;
await mediaCapture.InitializeAsync(settings);
// rotate to see preview vertically
mediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);
captureElement.Source = mediaCapture;
await mediaCapture.StartPreviewAsync();
}
}
private async void StopCamera()
{
if (mediaCapture != null)
{
await mediaCapture.StopPreviewAsync();
captureElement.Source = null;
mediaCapture = null;
}
}
当我调试代码时,我注意到在上面提到的场景中当app将其可见性更改为true时,它会转到Current_VisibilityChanged方法TWICE,并且在相机尝试启动时第二次发生崩溃。
对我来说最重要的是我的代码应该如何帮助这种情况? 但有趣的是,为什么在两种情况下都会使用该方法两次e.Visible和e.Handled具有相同的值? 当序列如下时,为什么它工作正常: