所以我有一个xml作为通知体,包括音频元素,源(src)属性指向预设的窗口声音,它不播放我想要的声音,而是播放默认的系统声音。我的通知xml看起来像这样(我将此作为测试消息发送通过Azure通知集线器调试选项)
<?xml version="1.0" encoding="utf-8"?>
<toast>
<visual>
<binding template="ToastText01">
<text id="1">Test message</text>
</binding>
</visual>
<audio src="ms-winsoundevent:Notification.Looping.Alarm" loop="false"/>
</toast>
我的应用程序上没有任何toast处理(没有启动后台任务或任何事情)。有趣的是,我的电脑在收到通知时会发出应有的声音,但手机每次都会播放默认声音。
我需要至少播放预设的窗口声音,但是从本地文件播放自定义声音将是王牌(这不适用于自定义声音)。另外,如果您知道是否有可能从通过Toast通知触发的后台任务开始播放音乐让我知道,我无法在此问题上找到谷歌的任何信息。
这是微软链接,告诉我的xml是好的(即使它不起作用):https://msdn.microsoft.com/en-us/library/windows/apps/br230842.aspx
答案 0 :(得分:1)
我的应用程序上没有任何toast处理(没有启动后台任务或任何事情)。有趣的是,我的电脑在收到通知时会发出应有的声音,但手机每次都会播放默认声音。
看起来所有前缀为ms-winsoundevent的值:Notification.Looping将被系统声音替换,而将loop loop元素设置为false。根据我的理解,这应该是预期的结果,这些值用于循环音频,如果需要禁用循环,请使用前5个值,例如:ms-winsoundevent:Notification.IM
但是从本地文件播放自定义声音将是王牌(这不适用于自定义声音)
这是[{3}}
中提到的已知问题原因是路径解析器有问题需要解决 ms-appx:///路径,因此音频src将被视为无效,然后是默认声音将会播放。
解决方法是将您的wav音频文件以编程方式复制到article并使用&#34; ms-appdata:/// local /&#34; 协议,例如:
private async void Button_Click(object sender, RoutedEventArgs e)
{
Windows.Storage.StorageFile audioFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/sound.wav"));
Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
await audioFile.CopyAsync(localFolder);
AddNotification();
}
public void AddNotification()
{
ToastTemplateType toastTemplate = ToastTemplateType.ToastText02;
XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);
XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
toastTextElements[0].AppendChild(toastXml.CreateTextNode("This is a Toast Message"));
IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
((XmlElement)toastNode).SetAttribute("launch", "MainPage.xaml");
XmlElement audio = toastXml.CreateElement("audio");
audio.SetAttribute("src", "ms-appdata:///local/sound.wav"); //Here
toastNode.AppendChild(audio);
ToastNotification toast = new ToastNotification(toastXml);
ToastNotificationManager.CreateToastNotifier().Show(toast);
}