1、首先從Windows Phone應用開發中,要用到播放音樂開始說起,目前微軟對這個限制的比較嚴格,如果有第三方音樂播放器在播放音樂,那麼當前打開的應用如果需要播放背景音樂的話,就要做出提示,否則是不能通過微軟的審覈的,自此,開始了一系列蛋疼的研究,不過過程一下,還是很高興的。
1)、先引入庫文件
using Microsoft.Xna.Framework.Media;
我的做法是直接在程序開頭加一個判斷,此方法也是網上流傳的方法
if (!MediaPlayer.GameHasControl)
{
if (MessageBox.Show("當前有程序正在播放音樂,你最好先關閉其他正在播放音樂的程序,否則無法使用當前程序的部分功能!", "小提示!",
MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
MediaPlayer.Stop();
MainPage.canPlay = true;
}
else
{
MainPage.canPlay = false;
}
}
else
{
canPlay = true;
}
2)、通過在主界面設置的靜態來達到控制是否可以播放背景音樂的,之後由於沒有真機,認爲已經沒有問題了,便直接上傳了,但是過了幾天,審覈不通過。。。。
看審覈結果:
主要就是說有異常出現了,後來借了同事真機測試,發現是這麼一個錯誤
FrameworkDispatcher.Update has not been called. Regular FrameworkDispatcher.Update calls are necessary for fire and forget sound effects and framework events to function correctly. See http://go.microsoft.com/fwlink/?LinkId=193853 for details.
3、根據提供的鏈接發現,原來winphone裏面播放音樂原來還是蠻複雜的,通過該鏈接提供的方法,重新添加了一個Service,OK,終於不會崩潰了,但是,又出來一個蛋疼的問題。
在這樣的場景下:當前使用音樂播放器播放音樂,打開了自己的應用,進入主頁有提示,並點擊取消後,音樂繼續播放,點擊頁面跳轉按鈕,跳到第二個界面,音樂自動被停止。
苦思冥想之下,終於在XMAL佈局文件裏發現問題了:
<MediaElement Name="animalVoice" Source="....這裏省略原內容" AutoPlay="False" />
原來MediaElement默認直接初始化資源了,而winphone裏面播放音樂默認應該是一個單例,這樣,相當於改變了當前正在播放的音樂的資源,直接導致了音樂被停止,所以大家可以在構造方法裏面通過布爾值去判斷,如果當前沒有音樂在播放,則直接初始化,否則不初始化,我是這樣寫的:
if (MainPage.canPlay)
{
Voice.Source =new Uri("/MyApplication;component/Resources/voice/voice0.mp3");
}
根據上面的一些問題,我總結了一下:
1、如果應用中有播放音樂的需要,一定要做一個提示,否則無法通過微軟的審覈,這裏我使用的MessageBox
2、在sliverlight應用中,如果需要播放音樂,可以使用官方提供的,實現IApplicationService接口,直接在程序中註冊,參考鏈接:http://msdn.microsoft.com/library/ff842408.aspx,或者在需要播放音樂的地方動物的對XNA裏面的一個Game類進行更新,參考鏈接:http://blog.csdn.net/wam82197567/article/details/7563923
3、如果有MediaElement控件,最好不要在XAML佈局文件中對Source進行初始化,可以在構造方法中通過一個布爾值去判斷是否要初始化