现在的位置: 首页 > 综合 > 正文

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

2013年03月13日 ⁄ 综合 ⁄ 共 2592字 ⁄ 字号 评论关闭

最近在做一个Win8 Store App的小项目。其中有一个关于在App运行过程中播放后台音乐的需求:

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

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

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

 

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

这里就不在赘述,可以参考下面这篇文章http://blog.csdn.net/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.csdn.net/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了。

抱歉!评论已关闭.