uwp 之后台音频
C# code 后台任务
----------------------------
public sealed class BgTask : IBackgroundTask
{
#region 私有字段
SystemMediaTransportControls mdcontrol = null;
BackgroundTaskDeferral deferral = null;
MediaPlayer currentPlayer = null;
// 后台音频是否已运行的标志
bool isRunning = false;
// 指示是否第一次播放
bool isFirstPlaying = false;
#endregion
public void Run(IBackgroundTaskInstance taskInstance)
{
//mdcontrol = SystemMediaTransportControls.GetForCurrentView();
//mdcontrol.IsEnabled = true;
//// 允许使用播放/暂停按钮
//mdcontrol.IsPlayEnabled = true;
//mdcontrol.IsPauseEnabled = true;
//// 处理ButtonPressed事件
//mdcontrol.ButtonPressed += mdcontrol_ButtonPressed;
// 获取MediaPlayer实例
currentPlayer = BackgroundMediaPlayer.Current;
// 处理事件,接收来自前台应用程序的消息
BackgroundMediaPlayer.MessageReceivedFromForeground += BackgroundMediaPlayer_MessageReceivedFromForeground;
// 关闭自动开始播放
currentPlayer.AutoPlay = false;
// 设置播放源
Uri audioUri = new Uri("ms-appx:///我爱我家.mp3");
currentPlayer.SetUriSource(audioUri);
deferral = taskInstance.GetDeferral();
// 当后台任务被取消时引发事件
taskInstance.Canceled += task_Canceled;
isRunning = true;
}
private void task_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
// 解除事件绑定
mdcontrol.ButtonPressed -= mdcontrol_ButtonPressed;
BackgroundMediaPlayer.MessageReceivedFromForeground -= BackgroundMediaPlayer_MessageReceivedFromForeground;
// 通知系统后台任务完成
deferral.Complete();
}
private void BackgroundMediaPlayer_MessageReceivedFromForeground(object sender, MediaPlayerDataReceivedEventArgs e)
{
// 接收消息
ValueSet val = e.Data;
if (val.ContainsKey("action"))
{
string msg = val["action"] as string;
if (msg.Equals("play")) //播放
{
isFirstPlaying = true;
Play();
isFirstPlaying = false;
}
else //暂停
{
Pause();
}
}
}
void mdcontrol_ButtonPressed(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args)
{
// 如果用户按下了播放键
if (args.Button == SystemMediaTransportControlsButton.Play)
{
Play();
}
// 如果用户按下了暂停按钮
else if (args.Button == SystemMediaTransportControlsButton.Pause)
{
if (currentPlayer.CurrentState == MediaPlayerState.Playing)
{
Pause();
}
}
}
#region 私有方法
/// <summary>
/// 播放
/// </summary>
void Play()
{
if (isRunning)
{
currentPlayer.Play();
if (isFirstPlaying)
{
// 更新系统多媒体控制界面的显示内容
// SystemMediaTransportControlsDisplayUpdater displayUpdater = mdcontrol.DisplayUpdater;
// 显示类型为音乐
//displayUpdater.Type = MediaPlaybackType.Music;
//// 设置显示的字段值
//displayUpdater.MusicProperties.Artist = "戴娆";
//displayUpdater.MusicProperties.Title = "我爱我家";
//// 更新显示
//displayUpdater.Update();
}
}
}
/// <summary>
/// 暂停
/// </summary>
void Pause()
{
if (isRunning)
{
currentPlayer.Pause();
}
}
#endregion
}
前台code
-------------------------------------------------------
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
}
/// <summary>
/// 在此页将要在 Frame 中显示时进行调用。
/// </summary>
/// <param name="e">描述如何访问此页的事件数据。
/// 此参数通常用于配置页。</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
// TODO: 准备此处显示的页面。
// TODO: 如果您的应用程序包含多个页面,请确保
// 通过注册以下事件来处理硬件“后退”按钮:
// Windows.Phone.UI.Input.HardwareButtons.BackPressed 事件。
// 如果使用由某些模板提供的 NavigationHelper,
// 则系统会为您处理该事件。
}
private void OnPlay(object sender, RoutedEventArgs e)
{
SendMessageToBackaudio("action", "play");
}
private void OnPause(object sender, RoutedEventArgs e)
{
SendMessageToBackaudio("action", "pause");
}
[Obsolete]
private void SendMessageToBackaudio(string key, object val)
{
ValueSet data = new ValueSet();
data[key] = val;
BackgroundMediaPlayer.SendMessageToBackground(data);
}
}
前台的xml 代码
-----------------------------------------------------------
<Page
x:Class="TestApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TestApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel Margin="15">
<Button Content="播放" Click="OnPlay"/>
<Button Content="暂停" Click="OnPause"/>
</StackPanel>
</Page>
public sealed class BgTask : IBackgroundTask { #region 私有字段 SystemMediaTransportControls mdcontrol = null; BackgroundTaskDeferral deferral = null; MediaPlayer currentPlayer = null; // 后台音频是否已运行的标志 bool isRunning = false; // 指示是否第一次播放 bool isFirstPlaying = false; #endregion public void Run(IBackgroundTaskInstance taskInstance) { //mdcontrol = SystemMediaTransportControls.GetForCurrentView(); //mdcontrol.IsEnabled = true; //// 允许使用播放/暂停按钮 //mdcontrol.IsPlayEnabled = true; //mdcontrol.IsPauseEnabled = true; //// 处理ButtonPressed事件 //mdcontrol.ButtonPressed += mdcontrol_ButtonPressed; // 获取MediaPlayer实例 currentPlayer = BackgroundMediaPlayer.Current; // 处理事件,接收来自前台应用程序的消息 BackgroundMediaPlayer.MessageReceivedFromForeground += BackgroundMediaPlayer_MessageReceivedFromForeground; // 关闭自动开始播放 currentPlayer.AutoPlay = false; // 设置播放源 Uri audioUri = new Uri("ms-appx:///我爱我家.mp3"); currentPlayer.SetUriSource(audioUri); deferral = taskInstance.GetDeferral(); // 当后台任务被取消时引发事件 taskInstance.Canceled += task_Canceled; isRunning = true; }
private void task_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason) { // 解除事件绑定 mdcontrol.ButtonPressed -= mdcontrol_ButtonPressed; BackgroundMediaPlayer.MessageReceivedFromForeground -= BackgroundMediaPlayer_MessageReceivedFromForeground; // 通知系统后台任务完成 deferral.Complete(); }
private void BackgroundMediaPlayer_MessageReceivedFromForeground(object sender, MediaPlayerDataReceivedEventArgs e) { // 接收消息 ValueSet val = e.Data; if (val.ContainsKey("action")) { string msg = val["action"] as string; if (msg.Equals("play")) //播放 { isFirstPlaying = true; Play(); isFirstPlaying = false; } else //暂停 { Pause(); } } }
void mdcontrol_ButtonPressed(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args) { // 如果用户按下了播放键 if (args.Button == SystemMediaTransportControlsButton.Play) { Play(); } // 如果用户按下了暂停按钮 else if (args.Button == SystemMediaTransportControlsButton.Pause) { if (currentPlayer.CurrentState == MediaPlayerState.Playing) { Pause(); } } }
#region 私有方法 /// <summary> /// 播放 /// </summary> void Play() { if (isRunning) { currentPlayer.Play(); if (isFirstPlaying) { // 更新系统多媒体控制界面的显示内容 // SystemMediaTransportControlsDisplayUpdater displayUpdater = mdcontrol.DisplayUpdater; // 显示类型为音乐 //displayUpdater.Type = MediaPlaybackType.Music; //// 设置显示的字段值 //displayUpdater.MusicProperties.Artist = "戴娆"; //displayUpdater.MusicProperties.Title = "我爱我家"; //// 更新显示 //displayUpdater.Update(); } } }
/// <summary> /// 暂停 /// </summary> void Pause() { if (isRunning) { currentPlayer.Pause(); } } #endregion }
uwp 之后台音频的更多相关文章
- Windows 10 后台音频
UWP版本的网易云音乐已经上架,虽然还不支持Windows Phone但是整体而言功能已经比较齐全了! 那么如何在Windows 10 UWP实现后台播放呢? 我之前是一直在做Windows Phon ...
- Windows Phone background Audio 后台音频
Windows Phone 后台音频的确不是什么新鲜的话题了,但发现目前在WP平台的音频播放应用多多少少会有一些瑕疵,所以在此给大家在此介绍下这个功能给有需要的朋友们. 首先介绍下我们的应用在后台播放 ...
- uwp 中的音频开发
xml code --------------------------------------------------- <UserControl x:Class="WinTest.H ...
- iOS AvPlayer AvAudioPlayer音频的后台播放问题
iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,Av ...
- 与众不同 windows phone (15) - Media(媒体)之后台播放音频
原文:与众不同 windows phone (15) - Media(媒体)之后台播放音频 [索引页][源码下载] 与众不同 windows phone (15) - Media(媒体)之后台播放音频 ...
- iOS音频的后台播放总结
在没有网络的情况下,音频的后台播放比较简单,google一下可以搜到很多资料,但是如果每次歌曲的请求都是通过网络,就不成了,有时可以也扛不了几首,这里总结下实现方法,可以实现像电台一样的功能,后台播 ...
- ios程序后台运行设置(不是太懂)
文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文 ...
- 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制
[源码下载] 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台 ...
- 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能
[源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows ...
随机推荐
- C语言:数组数据交换
//交换数组中各个变量的值:第1和最后一个交换,第2与倒数第二个交换 #include <stdio.h> int main() { int a[]={1,2,3,4,5,6,7,8,9} ...
- C语言:延时1秒
使用sleep()函数将程序阻塞,头文件在windows系统和linux系统下是不一样的windowsSleep()//第一个字母大写#include <windows.h>函数原型voi ...
- HTML元素属性及意义
HTML属性可以给元素添加附加信息,设置的时候以 (属性名="属性值")成对出现. 属性值应该始终包括在引号内(单引号或双引号),html对大小写不敏感,所以属性和属性值也不区分大 ...
- SFC style CSS variable injection
摘要 在单文件组件样式中支持使用组件状态驱动的 CSS 变量( CSS 自定义属性). 基础示例 <template> <div class="text"> ...
- PAT乙级:1064 朋友数 (20分)
PAT乙级:1064 朋友数 (20分) 题干 如果两个整数各位数字的和是一样的,则被称为是"朋友数",而那个公共的和就是它们的"朋友证号".例如 123 和 ...
- [NOIp2017]宝藏 题解
非常巧妙的 \(O(n^23^n)\) 做法. 题目的本质是要求一棵生成树,使得其每条边的长度与这条边的起点深度乘积的和最小. 我们使用状压 DP,考虑到当前状态与已经打通的点和深度有关,不妨设 \( ...
- String,String Builder,String Buffer-源码
目录 String 源码分析 常用的API isEmpty() length() charAt() substring() equals() equals()与"==" inter ...
- IO多路复用详解
假如你想了解IO多路复用,那本文或许可以帮助你 本文的最大目的就是想要把select.epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别. 基础知识 IO多路复 ...
- 如何开启MySQL远程连接
MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1)来连接访问,这对于 Web-Server 与 MySql-Server 都在同一台服务器上的网站架构来说 ...
- AT4828 [ABC152D] Handstand 2 TJ
前言 洛谷题解,懂?( 题目链接 来一点不一样的方法. 正解:动态规划 / 打表数据暴力分析 考试半小时想出方法,最后输在了两个细节上. 写一篇题解以此纪念. 打表暴力程序 最开始打的暴力对拍,没想到 ...