升级WP应用时注意的问题——WMAppManifest.xml

前一阵中游在线 创始人 杨亨冉 (http://weibo.com/nowpaper)在codeplex上开源了几个游戏,下载了采蘑菇这个游戏看了看,想参考一下在silverlight里播放声音的代码。于是直接把其中播放声音的代码修改后copy到了以前的一个项目里。不要告我侵权啊^_^

结果发现一到播放背景音乐的地方就出错。为啥捏?

找到了这个文章:http://www.dotblogs.com.tw/thewillwillweb/archive/2011/11/22/59115.aspx 

silverlight里播放声音可以用XNA里面的组件,先添加Microsoft.Xna.Framework.dll的引用,添加Microsoft.Xna.Framework 与 Microsoft.Xna.Framework.Audio 两个命名空间 

 第一种方法是使用 SoundEffect ,但播放后就无法停止,因此适合用来播放一些短的声音或音效:

Stream stream = TitleContainer.OpenStream("Resources/NightAmbienceSimple_01.wav");
SoundEffect effect = SoundEffect.FromStream(stream);
FrameworkDispatcher.Update();
effect.Play();

长一些的声音可以用 SoundEffectInstance    :

Stream stream = TitleContainer.OpenStream("Resources/NightAmbienceSimple_01.wav");
SoundEffect effect = SoundEffect.FromStream(stream);
SoundEffectInstance instance = effect.CreateInstance();
instance.Play();

这两种方法的区别还有:SoundEffect播放声音之前必须调用FrameworkDispatcher.Update(); 方法,而SoundEffectInstance不需要调用此方法就可以播放,而且可以设置暂停、继续、停止、重复等。详细的区别可以参考上面那位台湾朋友的文章。

采蘑菇的游戏里播放音效是使用了SoundEffect,但在播放背景音乐时,使用了MediaPlayer,关键代码如下:

public static void PlayBackSound()
{
if (IsMusicPlay == false || MediaPlayer.State == MediaState.Playing)
return;
FrameworkDispatcher.Update();
if (song_Background == null)
{
song_Background = Song.FromUri("background", new System.Uri("Sound/background.mp3", System.UriKind.Relative));


MediaPlayer.Volume = 0.5f;
MediaPlayer.IsRepeating = true;
MediaPlayer.Play(song_Background);
}
else
MediaPlayer.Resume();
}

使用MediaPlayer播放Song,Song提供了对歌曲库中歌曲的访问,FromUri()方法是从一个Uri路径创建此Song对象,看起来也很容易理解,但添加到项目中后,一运行到创建Song对象的代码便提示未知错误。单从调试信息来看得不到任何有用的消息。我反复对比了修改后的代码和源代码的区别,甚至直接新建一个页面直接调用PlayBackSound()方法,也是到初始化Song这一句就出错。

折腾了半天,于是改变策略直接新建一个项目就测试这一个方法。奇怪的是,这次正常运行了,可以正常初始化Song对象并播放出来。

不应该啊,难道我的项目有其他代码影响了这部分功能?

继续想,终于想到了,问题可能出现在WMAppManifest.xml里,这个文件里有一节 <Capabilities>,设置了此应用需要用到的功能,如使用传感器、使用摄像头、使用媒体等,而我的项目由于要发布到Marketplace上,发布前都要用Marketplace验证套件进行测试,把不需要的功能去掉,因此立即用Marketplace验证套件验证此项目,果然看到所需的Capabilities增加了ID_CAP_MEDIALIB和其他一些。增加此Capabilities后,终于正常了。OMG,竟然浪费了一天时间。

教训:如果在WP7的项目升级中增加了其他功能,相应的Capabilities也必须要及时调整。




posted @ 2012-01-31 09:53  yan_xiaodi  阅读(1131)  评论(1编辑  收藏  举报