您的位置:首页 > 其它

win8开发中后台音乐播放问题以及解决方案

2013-08-22 12:32 316 查看
最近在做一个Win8 Store App的小项目。其中有一个关于在App运行过程中播放后台音乐的需求:

1. 在整个App的生存周期内,音乐的播放要持续不断,如果只有一首音乐,要循环播放

2.在切换页面时,音乐要始终播放,不能停止。

3.为了美观考虑,整个界面不能出现任何关于音乐的控件

关于在win8 store App中播放音乐的问题非常容易实现:

这里就不在赘述,可以参考下面这篇文章/article/1354992.html

这篇文章写的非常详细,但是有一个问题,我们在一个页面中添加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生存期内播放音乐,但是好像还是不能后台播放,别急,我们将/article/1354992.html这篇文章中的必须要实现的那四个静态属性,添加在我们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了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐