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

最近在做一个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了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值