UWP自定义吐司通知声音无法在移动设备上播放

时间:2015-10-10 23:04:26

标签: notifications windows-phone win-universal-app uwp

所以我有一个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

1 个答案:

答案 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);
}