【发布时间】: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。