我正在尝试播放由于Windows Notification Service WNS事件而被激活的BackgroundActivated Task(单个进程)的声音。
如果在前景中启动应用程序,然后将其最小化,则说明一切正常。
如果当前未启动该应用程序...则此方法不起作用。
我的应用程序的OnBacgroundActivated:
protected override async void OnBackgroundActivated(BackgroundActivatedEventArgs args) {
PersistLog.v(TAG, "OnBackgroundActivated");
await VANotification.Process(args.TaskInstance);
//base.OnBackgroundActivated(args);
PersistLog.v(TAG, "OnBackgroundActivated:Completed");
}
VANotification.Proces
public async Task Process(IBackgroundTaskInstance taskInstance) {
PersistLog.v(TAG, "Process");
var Deferral = taskInstance.GetDeferral();
RawNotification notification = (RawNotification)taskInstance.TriggerDetails;
var msg = notification.Content;
PersistLog.i(TAG, "Msg:" + msg);
var a = Record(msg);
await TTSSandSound.Say(a);
Deferral.Complete();
PersistLog.v(TAG, "Process:Complete!");
}
TTSAndSound.Say ...
public static async Task Say(String text) {
PersistLog.v(TAG, "Say:" + text);
sSynthesize.Voice = SpeechSynthesizer.DefaultVoice;
var ss = sSynthesize.SynthesizeTextToStreamAsync(text);
var t = new TaskCompletionSource<MediaSource>();
ss.Completed = (stream, status) => {
var sr = stream.GetResults();
MediaSource ms = MediaSource.CreateFromStream(sr,sr.ContentType);
t.TrySetResult(ms);
};
var _ms = await t.Task;
var r = await WaitFor(_ms);
PersistLog.v(TAG, "Say:Complete:" + r);
}
private static async Task<bool> WaitFor(MediaSource ms) {
var mp = new MediaPlayer();
mp.Source = ms;
var t = new TaskCompletionSource<bool>();
mp.MediaEnded += (p, o) => {
t.TrySetResult(true);
};
mp.MediaFailed += (p, o) => {
t.TrySetResult(true);
};
mp.Play();
return await t.Task;
}
我实际上不确定这是MediaPlayer的问题还是BackgroundActivated任务似乎并不能解决问题。从日志中可以看到MediaPlayer正常完成。但是,在尝试进行MediaPlayer Play的大约同一时间,我收到了一个App Suspending事件。然后,在调用以下命令后,没有任何异步代码:
await TTSSandSound.Say(a);
似乎可以运行。我已经遵循:
Background media playback sample
最佳答案
注意... WNS到达时,在以地面模式激活应用程序时,此选项始终起作用。
该问题似乎与以下事实有关:在正确设置MediaPlayer之前,与前景相同的后台激活任务常常被挂起。
在一些测试用例中,.. MediaPlayer似乎已正确安装……在这些情况下,MedialPlayer正常工作。但是与MediaPlayer无关的异步任务仍然会引发异常:。
at Hap.App.<OnBackgroundActivated>d_27.MoveNext()
这似乎与应用暂停的时间有关。似乎由WNS触发的本地后台激活任务仅在暂停前少于1秒被允许。
关于c# - WNS从WNS调用的后台激活任务单进程模型中获取Windows Media Player,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39402236/