zoukankan      html  css  js  c++  java
  • 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    }

  • 相关阅读:
    POJ 3254 Corn Fields
    【Android】手机号码获取问题
    iOS自动自动隐藏软键盘
    cocos2d-x教程1 hello world
    ORA-02396: exceeded maximum idle time, please connect again的原因
    [置顶] WebService调用工具(AXIS2)
    经典union的使用
    Android Developers:按需求加载视图
    android手机关于google play商店闪退的解决办法
    [置顶] 两主机搭建MySQL主从复制后,show slave status显示:Last_IO_Error: error connecting to master ……
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14222947.html
Copyright © 2011-2022 走看看