【问题标题】:The media player does not start playing in the background when the application has access to extended execution session当应用程序有权访问扩展执行会话时,媒体播放器不会在后台开始播放
【发布时间】:2019-02-12 21:38:14
【问题描述】:

这是访问扩展执行会话的代码

public static async Task<bool> BeginExtendedExecution()
    {
        // Create new session.
        var newSession = new ExtendedExecutionSession()
        {
            Reason = ExtendedExecutionReason.Unspecified,
            Description = "Timer and notifications",
        };
        newSession.Revoked += SessionRevoked;

        // Try to request access to extended session.
        switch (await newSession.RequestExtensionAsync())
        {
            case ExtendedExecutionResult.Allowed:
                session = newSession;
                return true;
            default:
            case ExtendedExecutionResult.Denied:
                newSession.Revoked -= SessionRevoked;
                newSession.Dispose();
                return false;
        }
    }

这是后台无法正常运行的代码:

private async void DigitTimer_CountDownEnded(object sender, EventArgs e)
    {
        var stream = await Exercises.SynthesizeExercise(settingsButton.SelectedExercise);
        mediaPlayerElement.MediaPlayer.Source = MediaSource.CreateFromStream(stream, stream.ContentType);
        Debug.WriteLine("here");
        mediaPlayerElement.MediaPlayer.Play();
    }

我得到“这里”的输出,但媒体播放器没有开始播放。当应用程序离开后台时,媒体播放器会播放声音,就好像它一直处于打开状态一样。当我再次将应用程序发送到后台模式时,声音正常播放。

我在清单文件中有后台媒体播放功能。

编辑:我发现 MediaPlayer 无法开始播放,因为mediaPlayerElement.MediaPlayer.AudioStateMonitor.SoundLevel == SoundLevel.Muted 我不能直接改变它,因为它是只读的,这个值是由系统决定的。所以我唯一能做的就是 无休止地播放声音。

【问题讨论】:

  • @kennyzx 对不起。在实际代码中,我调用了一个异步函数。
  • 展示如何注册计时器的“CountdownEnd”事件。
  • @kennyzx 我有一个用户控件“DigitTimer”。我在 mainpage.xaml 中使用它:
  • @kennyzx 事件肯定有效,因为我得到了“这里”的输出。我还在此事件中显示通知,它们工作正常。我认为问题出在媒体播放器上。我会尝试使用后台任务来做同样的事情。
  • 根据您的描述,我怀疑这是由于“异步”使用不当造成的。 countdownended 方法被声明为“async void”,因此它被视为立即完成,应用程序被置于暂停状态。尝试将 async void 更改为 async Task。

标签: c# uwp


【解决方案1】:

好的,我终于找到了解决方案。您需要在进入后台模式之前指定一个非 null 的 MediaPlayer 源值,否则系统会将 MediaPlayer 的声音静音。

private async void Page_Loaded(object sender, RoutedEventArgs e)
    {
        var stream1 = await new SpeechSynthesizer().SynthesizeTextToStreamAsync("");
        player.Source = MediaSource.CreateFromStream(stream1, stream1.ContentType);
        player.MediaPlayer.Play();

        await BeginExtendedExecution();

        await Task.Delay(3000);

        var stream2 = await new SpeechSynthesizer().SynthesizeTextToStreamAsync("Test.");
        player.Source = MediaSource.CreateFromStream(stream2, stream2.ContentType);
        player.MediaPlayer.Play();
        Debug.WriteLine(player.MediaPlayer.AudioStateMonitor.SoundLevel);
    }

您可以自己检查。打开后立即尝试此代码并最小化应用程序(声音应该不起作用):

private async void Page_Loaded(object sender, RoutedEventArgs e)
    {
        await BeginExtendedExecution();

        await Task.Delay(3000);

        var stream2 = await new SpeechSynthesizer().SynthesizeTextToStreamAsync("Test.");
        player.Source = MediaSource.CreateFromStream(stream2, stream2.ContentType);
        player.MediaPlayer.Play();
        Debug.WriteLine(player.MediaPlayer.AudioStateMonitor.SoundLevel);
    }

【讨论】:

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