【问题标题】:MediaCapture + CaptureElement lifecycle/navigation managementMediaCapture + CaptureElement 生命周期/导航管理
【发布时间】:2015-02-19 04:12:40
【问题描述】:

这是在 Windows Phone 8.1 Store 应用程序中。我的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 按钮,然后使用任务切换器返回到我的应用程序
  • 用户按下搜索按钮,然后按下返回按钮
  • 用户按下电源按钮,然后再次按下并向上滑动以解锁设备
  • 用户按住返回按钮进入任务切换器,然后再次点击我的应用程序

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

如果用户随后导航到不同的页面,然后返回到 MainPage,则预览会再次开始运行而不会出现问题,因此这让我相信我只需要在从其中一个页面返回后停止/启动预览以上场景。

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

【问题讨论】:

    标签: c# windows-runtime windows-store-apps windows-phone-8.1 win-universal-app


    【解决方案1】:

    您必须将App.Suspending 和App.Resuming(对于您描述的情况)与导航事件的组合(在页面之间导航时)结合使用。 OnNavigatingFrom 事件在您点击 Start、按住 Back 或使用 Search(当应用程序暂停时)时调用,但是当您恢复应用程序,OnNavigatedTo 被不调用 - 此事件仅在您导航时调用。所以在你的情况下,当你点击 Start 时,预览会停止,当你回来时它不会再次开始。 A refference to MSDN:

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

    另一件事是,要正确调试应用程序,您必须在 Visual Studio 中使用 Debug Location 选项卡 的 生命周期事件 - 在调试应用程序时,它没有被暂停,但是当您正常运行应用程序时,它会在您点击 Start 后暂停。

    还请注意,应用程序可以进入未运行状态。更多关于Lifecycle at MSDN。

    【讨论】:

    • 我在 App.xaml.cs 中也订阅了这些事件,但它们仅在我使用 Visual Studio 中的暂停/恢复按钮来模拟生命周期事件时触发。当我只是执行上面解释的场景时,它们不会触发。你说这正常吗?在调试模式下,应用程序在进入后台时不会被挂起,但如果我在没有调试器的情况下运行它会挂起?没有调试器我还无法运行应用程序,因为如果我尝试从应用程序列表启动它,它会短暂显示初始屏幕,然后立即返回应用程序列表。
    • @noroom 我也觉得这很令人困惑,但现在它是这样工作的。在OnNavigatedTo 和OnNavigatedFrom 设置断点,你会看到第二个被命中,但第一个没有。您的应用程序(没有调试器)将在导航离开后暂停。奇怪的是,没有调试器就无法运行它——如果它退出,则意味着你可能有异常——尝试寻找它。
    【解决方案2】:

    您描述的场景应该触发Window.Current.VisibilityChanged 事件,您可以使用传递给事件处理程序的VisibilityChangedEventArgs.Visible 在不可见时清理预览并在可见时初始化预览。您可以在 Page\UserControl 的 Loaded\Unloaded 处理程序中订阅\取消订阅 Window.Current.VisibilityChanged 事件。

    Suspend/Resume 生命周期事件不够充分的原因是,您上面提到的场景并不能确定性地在某个时间调用这些事件,因为操作系统只会根据可能随操作系统变化的内部策略暂停应用程序发布更新。

    另外,我会避免使用 Navigation 处理程序,而是依赖 Loaded\Unloaded 处理程序,如果您不得不将 CaptureElement 移动到其自己的 UserControl 中而不是 Page 和避免了 WP 会调用 OnNavigatedFrom 而不会调用 OnNavigatedTo 进行暂停\恢复的场景(Loaded\Unloaded 将始终按顺序调用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多