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了。
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了。
相关文章推荐
- 项目中遇到的问题以及解决方案(Java后台)
- iOS 后台播放音乐问题记录
- FLEX:开发中碰到的棘手问题以及解决方案(包括悬而未决的)
- ios播放声音中断后台音乐的问题
- 关于animation PlayState在ios上不起作用, 以及ios前端页面音乐不能自动播放的问题
- 基于.net core2.1开发遇到的问题记录以及解决方案
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!
- 最新版 iOS开发 支持后台音乐播放
- yii2开发遇到的问题以及解决方案
- Hive开发中面临的问题以及解决方案
- 在后台有音乐播放的情况下用AVAudioRecorder进行录音问题的解决
- OS音频开发之音乐播放器 - 后台播放音乐
- Tomcat于Eclipse集成开发问题以及解决方案
- AVPlayer 音乐播放后台播放,以及锁屏主题设置
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!【2011年12月18日补充】
- IOS开发中遇到的各种问题以及解决方案集锦
- vs2008开发中的问题。以及解决方案
- 利用MCI命令进行 播放录制音乐,以及弹出光驱,音量控制获得播放进度等等操作。。。开发必备。
- 利用MCI命令进行 播放录制音乐,以及弹出光驱,音量控制获得播放进度等等操作。。。开发必备。
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!【2011年12月18日补充】