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 ...
随机推荐
- HTML元素属性及意义
HTML属性可以给元素添加附加信息,设置的时候以 (属性名="属性值")成对出现. 属性值应该始终包括在引号内(单引号或双引号),html对大小写不敏感,所以属性和属性值也不区分大 ...
- [010] - JavaSE面试题(十):集合之Map
第一期:Java面试 - 100题,梳理各大网站优秀面试题.大家可以跟着我一起来刷刷Java理论知识 [010] - JavaSE面试题(十):集合之Map 第1问:HashMap和HashTable ...
- Spring总结之SpringMvc上
一.简介 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架. 二.流程架构 1.用户发送请求至 前端控制器DispatcherServlet ...
- Xshell、winscp连不上Linux虚拟机
1.环境 本地机器WIN7环境,使用VMware Workstation Pro安装的CentOS7,系统镜像CentOS-6.1-x86_64-netinstall.iso 2.问题与分析 我的虚拟 ...
- Vue项目发布的问题--http://localhost:8088/static/fonts/fontawesome-webfont.af7ae50.woff2
问题:ngnix将8080转成80对外访问,找不对woff2等文件 一\ 搭建环境 ngnix-->conf中 server { listen 80; server_name 10.9.240. ...
- 忘记oracle的sys和system的密码
step1:通过cmd打开命令提示符, sqlplus /nolog step2:输入conn /as sysdba step3:输入alter user system identified by 新 ...
- SQL Server 判断表名称、索引、表字段是否存在
1.判断索引是否存在 ps:@tableName 表名称, @indexName 索引名 IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id=OB ...
- MVC从客户端中检测到有潜在危险的Request.Form值的解决方法
1.ASPX页面 在页面头部的page中加入ValidateRequest="false" 2.web.config中配置validateRequest="false&q ...
- DOS命令--Windows操作系统之母
DOS命令 DOS是什么 解释:Disk Operating System的缩写,意思是"磁盘操作系统" 系统:DOS就是人给机器下达命令的集合,是存储在操作系统中的命令集 基本用 ...
- 《MySQL实战45讲》(1-7)笔记
<MySQL实战45讲>笔记 目录 <MySQL实战45讲>笔记 第一节: 基础架构:一条SQL查询语句是如何执行的? 连接器 查询缓存 分析器 优化器 执行器 第二节:日志系 ...