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 ...
随机推荐
- python:录屏录音
import pyaudio import wave from PIL import ImageGrab import cv2 import threading import time from nu ...
- jieba分词处理
分词是一种数学上的应用,他可以直接根据词语之间的数学关系进行文字或者单词的抽象,比如,讲一句话"我来自地球上中国"进行单词分割,我们可能会得到如下的内容:"我" ...
- VS Code 与 ESP32 官方SDK配置
开发基于 ESP XXX 微控制器应用,最简单的环境搭建方案是像 MicroPython.CircuitPython.NanoFramework 等,下载固件,直接开刷:或者基于 Arduino 的开 ...
- Ubuntu 18.04 开启 root 账号并允许远程连接
转载:https://blog.csdn.net/u010766726/article/details/105376461 以普通用户登录系统 通过 "终端" 操作 普通用户 – ...
- React优化
这里主要分析在函数式react中的优化,类组件有生命周期函数定义较明确 React的核心特征之一是单向数据流(props自上往下流) 这会导致一个问题:当父组件state更新后,其自身及其所有chil ...
- Linux + NodeJS 常用命令
Linux系统常用命令 1.su 由当前用户切换至root用户: 2. su username 切换至某一用户: 3.chmod u+w /etc/sudoers 为/etc/sudoers文件添加写 ...
- vue3.0使用ant-design-vue进行按需加载原来这么简单
下载 ui库 yarn add ant-design-vue 默认是全局引入,打包后体积很大, 非常影响首屏加载速度, 按需加载 下载按需加载的插件;推荐使用cnpm cnpm install bab ...
- 🏆【Java技术专区】「并发编程专题」教你如何使用异步神器CompletableFuture
前提概要 在java8以前,我们使用java的多线程编程,一般是通过Runnable中的run方法来完成,这种方式,有个很明显的缺点,就是,没有返回值.这时候,大家可能会去尝试使用Callable中的 ...
- Tomcat PUT方法任意写文件漏洞(CVE-2017-12615)
Apache Tomcat 7.0.0~7.0.79 直接发送以下数据包即可在Web根目录写入shell: PUT /1.jsp/ HTTP/1.1 Host: 192.168.49.2:8080 A ...
- 浏览器中hook对象属性
先获取window对象属性 来源: 夜幕爬虫安全论坛 原文链接: http://bbs.nightteam.cn/thread-485.htm?orderby=desc&user=7