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 之后台音频的更多相关文章

  1. Windows 10 后台音频

    UWP版本的网易云音乐已经上架,虽然还不支持Windows Phone但是整体而言功能已经比较齐全了! 那么如何在Windows 10 UWP实现后台播放呢? 我之前是一直在做Windows Phon ...

  2. Windows Phone background Audio 后台音频

    Windows Phone 后台音频的确不是什么新鲜的话题了,但发现目前在WP平台的音频播放应用多多少少会有一些瑕疵,所以在此给大家在此介绍下这个功能给有需要的朋友们. 首先介绍下我们的应用在后台播放 ...

  3. uwp 中的音频开发

    xml code --------------------------------------------------- <UserControl x:Class="WinTest.H ...

  4. iOS AvPlayer AvAudioPlayer音频的后台播放问题

    iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了.如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,Av ...

  5. 与众不同 windows phone (15) - Media(媒体)之后台播放音频

    原文:与众不同 windows phone (15) - Media(媒体)之后台播放音频 [索引页][源码下载] 与众不同 windows phone (15) - Media(媒体)之后台播放音频 ...

  6. iOS音频的后台播放总结

     在没有网络的情况下,音频的后台播放比较简单,google一下可以搜到很多资料,但是如果每次歌曲的请求都是通过网络,就不成了,有时可以也扛不了几首,这里总结下实现方法,可以实现像电台一样的功能,后台播 ...

  7. ios程序后台运行设置(不是太懂)

    文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以, 1.音乐 2.location 3.voip 文 ...

  8. 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制

    [源码下载] 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台 ...

  9. 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能

    [源码下载] 与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 作者:webabcd 介绍与众不同 windows ...

随机推荐

  1. 使用deepin连接罗技k380

    1,刚开始总是连不上,连上了就断开了,以为是deepin系统的问题. 2,首先在华为论坛上找到这样的一片解决方案:https://cn.ui.vmall.com/thread-21831568-1-1 ...

  2. CSS样式实现表头和列固定

    效果图:第一行和第一列固定       <!DOCTYPE html> <html lang="zh"> <head> <meta cha ...

  3. odoo12学习之javascript-----2

    用例子:Creating a new field widget 这可能是一个非常常见的用例:我们希望以非常具体(可能依赖于业务)的方式在表单视图中显示一些信息. 例如,假设我们要根据某些业务条件更改文 ...

  4. JavaScript关于对象的一些小知识

    javascript的对象 javascriot(之后用js代替)中基本数据类型之一,是复合类型的数据. 对象在js中应用十分广泛,几乎所有的的事物都是做对象,js的对象拥有自己的属性和方法的数据 在 ...

  5. 字符串匹配算法(二)-BM算法详解

    我们在字符串匹配算法(一)学习了BF算法和RK算法,那有没更加高效的字符串匹配算法呢.我们今天就来聊一聊BM算法. BM算法 我们把模式串和主串的匹配过程,可以看做是固定主串,然后模式串不断在往后滑动 ...

  6. 深入刨析tomcat 之---第7篇 这个是链接,如果使用idea 创建servlet工程

    recoded by 张艳涛 使用IDEA创建Servlet项目 使用IDEA创建Servlet项目

  7. 构建前端第3篇之---使用scss

    张艳涛 写于2021-1-20 主要解决俩个问题: 在单个vue文件中 <style rel="stylesheet/scss" lang="scss"& ...

  8. 基于MD5+RSA算法实现接口调用防扯皮级鉴权

    概述 最近项目中需要对第三方开发接口调用,考虑了一下,准备采用MD5+RSA算对请求数据进行签名,来达到请求鉴权,过滤非法请求的目标. 数字签名采用MD5+RSA算法实现.RSA私钥要严格保密并提供安 ...

  9. synchronized 加锁 this 和 class 的区别!

    synchronized 是 Java 语言中处理并发问题的一种常用手段,它也被我们亲切的称之为"Java 内置锁",由此可见其地位之高.然而 synchronized 却有着多种 ...

  10. 如何在windows 11中安装WSLG(WSL2)

    什么是 WSL WSL(Windows Subsystem for Linux):Windows 系统中的一个子系统,在这个子系统上可以运行 Linux 操作系统. 可以让开发人员直接在 Window ...