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语言变量 类型判断
变量三要素: 一个变量有三个基本的要素,变量的名称,变量的类型,变量的值.所以int a = 10; 变量名为a,变量的存储类型为int型,变量的值为10. 变量还有一些属性如作用范围和存储类型. 变 ...
- Grafana、Prometheus-监控平台
一:Grafana 简介与部署 安利一个生产环境正在使用的监控和告警平台:grafana,它是一个开源的可对指标和日志进行查询.可视化和告警的平台. docker 安装官方文档:https://gra ...
- Spark—RDD编程常用转换算子代码实例
Spark-RDD编程常用转换算子代码实例 Spark rdd 常用 Transformation 实例: 1.def map[U: ClassTag](f: T => U): RDD[U] ...
- PHP获取当日或本月时间戳范围
在mysql数据库中使用int类型保存时间戳时,一般在程序中可能会用到统计当日,当月的一些数据.那么可以用如下的方式限定时间范围: //当日销售 $today_start = strtotime( ...
- P5311 [Ynoi2011] 成都七中
P5311 [Ynoi2011] 成都七中 题意 给你一棵 \(n\) 个节点的树,每个节点有一种颜色,有 \(m\) 次查询操作. 查询操作给定参数 \(l\ r\ x\),需输出: 将树中编号在 ...
- python读取数据写入excel的四种操作
Python对Excel的读写主要有:xlrd.xlwt.xlutils.openpyxl.xlsxwriter几种 xlutils结合xlrd: 操作的是以xls后缀的excel,读取文件保留原格式 ...
- odoo中Controller
一:Controller 一般通过继承的形式来创建controller类,继承自odoo.http.Controller. 以route装饰器来装饰定义的方法,提供url路由访问路径: class M ...
- 迈达斯midas Gen 2019 2.1 中文汉化安装教程
midas Gen 2019 v2.1 for win是一款关于结构设计有限元分享的工具,分为建筑领域.桥梁领域.岩土领域.仿真领域四个大类.具有人性化的操作界面,且采用了优秀的的计算机显示技术,是建 ...
- 媒体应用视频超分AI神器!360P视频一键转换HD
作为多媒体应用的开发者,你是否想为媒体播放器快速开发创新AI功能?例如: 在播放低画质视频过程中对其进行逐帧超分 让满屏飘飞的弹幕自动绕过画面的主体人物 HMS Core 6.0.0开放的多媒体管线服 ...
- 移植TensorFlow到Windows平台
2015年11月,Google宣布开源旗下机器学习工具TensorFlow,引发业界热潮.TensorFlow原生支持*unix系和安卓平台,但并不提供对Windows平台的支持.如果想在Window ...