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 ...
随机推荐
- Java基础00-异常25
1. 异常 异常 1.1 异常概述 1.2 JVM的默认处理方案 有一行代码报错,下面的代码就不会执行. 1.3 异常处理 如果程序出现了异常,需要我们自己来处理,因为在实际的开发中,不能因为一处的报 ...
- Leetcode6. Z 字形变换
> 简洁易懂讲清原理,讲不清你来打我~ 输入字符串,按下右上下右上排列后输出字符串-grpc使用etcd做服务发现
grpc通过etcd实现服务发现 前言 服务注册 服务发现 负载均衡 集中式LB(Proxy Model) 进程内LB(Balancing-aware Client) 独立 LB 进程(Externa ...
- 啥是 MySQL 事务隔离级别?
之前发过一篇文章,简单了解 MySQL 中相关的锁,里面提到了,如果我们使用的 MySQL 存储引擎为 InnoDB ,并且其事务隔离级别是 RR 可重复读的话,是可以避免幻读的. 但是没想到,都 1 ...
- Leetcode:面试题68 - II. 二叉树的最近公共祖先
Leetcode:面试题68 - II. 二叉树的最近公共祖先 Leetcode:面试题68 - II. 二叉树的最近公共祖先 Talk is cheap . Show me the code . / ...
- POJ3662
poj3662 大意:n个点p条边的无向图,求在删去k条边后使1和n号点联通路径上的最长边最小值. 一开始理解错题意以为是分层图求最短路径,结果写完发现k太大了发现事情没有那么简单(讨厌英语题面!) ...
- maven 工程构建 之_____<dependencyManagement>标签
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Apache OfBiz 反序列化命令执行漏洞(CVE-2020-9496)
影响版本 - Apache Ofbiz:< 17.12.04 访问 https://192.168.49.2:8443/webtools/control/xmlrpc 抓包 进行数据包修改 pa ...
- Go测试技术分享(一):场景化接口Case编写
一.前言 本人负责的支付清结算方向的测试工作,在测试项目中,会出现流程化的接口调用,请求完一个接口后,继续请求另一个接口(这里的接口可以指Http,也指rpc接口),这里以一个真实场景为例:用户在平台 ...
- OpenGL学习笔记(三)着色器
目录 Shader是什么 GLSL 数据类型 输入与输出 顶点着色器向片段着色器发送数据 Uniform 制作三色渐变三角形 对着色器程序进行封装 参考资料:OpenGL中文翻译 Shader是什么 ...