最近在做一个Win8 Store App的小项目。其中有一个关于在App运行过程中播放后台音乐的需求:
1. 在整个App的生存周期内,音乐的播放要持续不断,如果只有一首音乐,要循环播放
2.在切换页面时,音乐要始终播放,不能停止。
3.为了美观考虑,整个界面不能出现任何关于音乐的控件
关于在win8 store App中播放音乐的问题非常容易实现:
这里就不在赘述,可以参考下面这篇文章http://blog.youkuaiyun.com/tcjiaan/article/details/8145289
这篇文章写的非常详细,但是有一个问题,我们在一个页面中添加MediaElement控件之后,如果需要切换页面的时候,音乐就会停止,这种设计真的是一种灾难啊!!但是在查找了很多MSDN上面的资料后,也没有什么解决方法,因为可能是微软鼓励XAML开发,很多文章都是讲控件的。所以我们必须要换一种思路:
1、首先我想到能不能新建一个新的页面,然后再这个页面中加载控件,然后让所有的页面都引用该页面,但是发现这种方法的可能性不大。
2、第二个我想到了在App.XAML和App.Xaml.cs中做文章。因为这页面是App运行时必须加载的。通常我们在拖动控件的时候,都是在控件上双击,然后去编辑他的callback函数。于是乎,我们可以这样来设计,我们将我们的控件用代码的形式,在App.xaml.cs中初始化的时候生成。避免了必须在一个页面上要生成MediaElement控件。看一下代码:在App.xaml.cs中声明控件变量
public static MediaElement myMediaElement = new MediaElement();
//1.这里我们依然采用MediaElement只不过是我们不能在App.xaml中添加控件,但是我们可以在.cs文件中声明这样一个变量然后调用的啊!!!
public static IRandomAccessStream soundStream = null;
//2.声明流文件
然后在App的构造函数中:
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
myMediaElement.AudioCategory = AudioCategory.BackgroundCapableMedia;
myMediaElement.IsLooping = true;
myMediaElement.AutoPlay = true;
//3.设置音频的一些属性,AudioCategory支持后台播放,IsLooping支持循环
//AutoPlay加载即播放
}
在我们的mainpage.cs中
private async void ApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
if (App.soundStream == null)
{
string fileLocation = "ms-appx:///Assets/";
string fileName = "Summer.mp3";
var filestream = RandomAccessStreamReference.CreateFromUri(new Uri(fileLocation + fileName));
App.soundStream = await filestream.OpenReadAsync();
//App.myMediaElement.MediaOpened += myMediaElement_MediaOpened_1;
App.myMediaElement.SetSource(App.soundStream, App.soundStream.GetType().ToString());
}
}
然后在MainPage()的构造函数中调用
public MainPage()
{
this.InitializeComponent();
this.ApplicationPage_Loaded(this, null);
}
到此为止我们就实现了在App生存期内播放音乐,但是好像还是不能后台播放,别急,我们将http://blog.youkuaiyun.com/tcjiaan/article/details/8145289这篇文章中的必须要实现的那四个静态属性,添加在我们MainPage的 LoadState中
protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
// TODO: 创建适用于问题域的合适数据模型以替换示例数据
MediaControl.PlayPressed += MediaControl_PlayPressed;
MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
MediaControl.PausePressed += MediaControl_PausePressed;
MediaControl.StopPressed += MediaControl_StopPressed;
}
然后再将相关的实现代码从那篇文章中复制过来,整理一下。。就ok了。