mediaccapture + CaptureElement生命周期/导航管理



这是一个Windows Phone 8.1商店应用程序。我的MainPage有一个CaptureElement来显示我的MediaCapture对象的预览流。对于应用程序内的导航(页面之间),这很有效:

MediaCapture mc;
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
   mc = new MediaCapture();
   await mc.InitializeAsync();
   preview.Source = mc;
   await mc.StartPreviewAsync();
}
protected override async void OnNavigatedFrom(NavigationEventArgs e)
{
   await mc.StopPreviewAsync();
}

我可以导航到其他页面并返回,并且预览运行可靠。我在以下场景中遇到了问题:

  • 用户按Windows键,然后按后退键
  • 用户按下Windows按钮,然后使用任务切换器返回到我的应用程序
  • 用户先按搜索键,再按返回键
  • 用户按下电源键,然后再次按下电源键并向上滑动解锁设备
  • 用户按住后退键进入任务切换器,然后再次点击我的应用

在以上每个动作(和/或它们的组合)之后,当我的应用程序返回时,预览被冻结在显示的最后一帧。

如果用户随后导航到不同的页面,然后返回到主页面,则预览再次开始运行而没有任何问题,因此这使我相信我只需要在从上述场景之一返回后停止/启动预览。

我尝试订阅App.SuspendingApp.Resuming事件,但是这些事件在这些情况下不会触发。我错过了什么?

您将不得不使用App.SuspendingApp.Resuming(对于您所描述的情况)与导航事件的组合(在页面之间导航时)。当您点击开始,按住返回或使用搜索时(当应用程序处于挂起状态时),OnNavigatingFrom事件被调用,但当您恢复应用程序时,OnNavigatedTo而不是被调用-此事件仅在您导航时被调用。在你的例子中,当你点击开始时,预览停止,当你回来时它不会再次开始。对MSDN的引用:

注意在Windows Phone上,OnNavigatedFrom()在应用程序暂停时被调用。OnNavigatedTo()在应用程序恢复时不会被调用。

另一件事是,要正确调试应用程序,你必须使用Lifecycle Events debug Location选项卡在Visual Studio中-当你调试应用程序时,它不会被挂起,但是当你正常运行应用程序时,它会在你点击Start后被挂起。

还请注意,应用程序可以设置为未运行状态。

您描述的场景应该触发Window.Current.VisibilityChanged事件,您可以使用传递给事件处理程序的VisibilityChangedEventArgs.Visible在不可见时清除预览,并在可见时初始化预览。您可以订阅/取消订阅Window.Current.VisibilityChanged事件在您的加载卸载处理程序为您的页面UserControl。

挂起/恢复生命周期事件是不够的,因为你上面提到的场景不能确定地在某个时间调用这些事件,因为操作系统只会根据内部策略挂起一个应用程序,这个策略可以随着操作系统版本的更新而改变。

也作为一个旁白,我会避免使用导航处理程序,而是依赖于加载卸载处理程序,这将允许初始化清理正确发生,如果你曾经不得不移动你的CaptureElement到自己的UserControl,而不是在一个页面,并避免场景WP将调用OnNavigatedFrom,而不是调用OnNavigatedTo暂停resume(加载卸载将始终按顺序调用)。

最新更新