zoukankan      html  css  js  c++  java
  • Windows Phone 8.1 多媒体(3):音乐

    Windows Phone 8.1 多媒体(1):相片

    Windows Phone 8.1 多媒体(2):视频

    Windows Phone 8.1 多媒体(3):音乐


    (1)前台

    说是前台,其实音乐的播放都是利用系统后台的 BackgroundMediaPlayer:

    BackgroundMediaPlayer.Current.SetUriSource(new Uri("ms-appx:///djlang59_-_Drops_of_H2O_(_The_Filtered_Water_Treatment_).mp3"));
    BackgroundMediaPlayer.Current.Play();

    可以添加音乐播放状态改变事件:

    BackgroundMediaPlayer.Current.CurrentStateChanged += MediaPlayerStateChanged;
    
    private async void MediaPlayerStateChanged(MediaPlayer sender, object args
    {
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            switch( BackgroundMediaPlayer.Current.CurrentState )
            {
                case MediaPlayerState.Stopped:
                    AppBarBtnPause.IsEnabled = false;
                    AppBarBtnStop.IsEnabled = false;
                    break;
                case MediaPlayerState.Playing:
                    AppBarBtnPause.IsEnabled = true;
                    AppBarBtnStop.IsEnabled = true;
    
                    BackgroundMediaPlayer.SendMessageToBackground(new ValueSet
                    {
                        {"Title", "Drops of H2O"},
                        {"Artist", "J.Lang"},
                    });
                    break;
                case MediaPlayerState.Paused:
                    AppBarBtnPause.IsEnabled = false;
                    break;
            }
        });
    }

    其中 BackgroundMediaPlayer.SendMessageToBackground 方法可以向后台音乐播放程序发送消息,可在后台程序中添加处理事件:

    BackgroundMediaPlayer.MessageReceivedFromForeground += BackgroundMediaPlayerOnMessageReceivedFromForeground;
    
    private void BackgroundMediaPlayerOnMessageReceivedFromForeground(object sender, MediaPlayerDataReceivedEventArgs e)
    {
        systemmediatransportcontrol.DisplayUpdater.Type = MediaPlaybackType.Music;
        systemmediatransportcontrol.DisplayUpdater.MusicProperties.Title = e.Data["Title"].ToString();
        systemmediatransportcontrol.DisplayUpdater.MusicProperties.Artist = e.Data["Artist"].ToString();
        systemmediatransportcontrol.DisplayUpdater.Update();
    }

    (2)后台

    这里说的后台是指 SystemMediaTransportControls,也就是按下音量键后顶部弹出的控制音乐播放的控件。

    1)新建 Windows Runtime Component 和继承 IBackgroundTask 的后台类

    A:Run 方法中可设置 SystemMediaTransportControls 的各个按键属性以及事件的订阅(比如下一曲按钮可不可用,状态更改事件等)

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        systemmediatransportcontrol = SystemMediaTransportControls.GetForCurrentView();
        systemmediatransportcontrol.ButtonPressed += SystemControlsButtonPressed;
        systemmediatransportcontrol.IsEnabled = true;
        systemmediatransportcontrol.IsPauseEnabled = true;
        systemmediatransportcontrol.IsStopEnabled = true;
        systemmediatransportcontrol.IsPlayEnabled = true;
    
        BackgroundMediaPlayer.Current.CurrentStateChanged -= BackgroundMediaPlayerCurrentStateChanged;
        BackgroundMediaPlayer.MessageReceivedFromForeground -= BackgroundMediaPlayerOnMessageReceivedFromForeground;
        BackgroundMediaPlayer.Current.CurrentStateChanged += BackgroundMediaPlayerCurrentStateChanged;
        BackgroundMediaPlayer.MessageReceivedFromForeground += BackgroundMediaPlayerOnMessageReceivedFromForeground;
    
        deferral = taskInstance.GetDeferral();
    }

    B:事件的处理

    private void BackgroundMediaPlayerCurrentStateChanged(MediaPlayer sender, object args)
    {
        if (sender.CurrentState == MediaPlayerState.Playing)
        {
            systemmediatransportcontrol.PlaybackStatus = MediaPlaybackStatus.Playing;
        }
        else if (sender.CurrentState == MediaPlayerState.Paused)
        {
            systemmediatransportcontrol.PlaybackStatus = MediaPlaybackStatus.Paused;
        }
    }
    
    private static void SystemControlsButtonPressed(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args)
    {
        switch (args.Button)
        {
            case SystemMediaTransportControlsButton.Play:
                BackgroundMediaPlayer.Current.Play();
                break;
            case SystemMediaTransportControlsButton.Pause:
                BackgroundMediaPlayer.Current.Pause();
                break;
            case SystemMediaTransportControlsButton.Stop:
                BackgroundMediaPlayer.Current.Pause();
                BackgroundMediaPlayer.Current.Position = TimeSpan.FromSeconds(0);
                break;
        }
    }

    2)前台应用添加上一步新建的后台任务

  • 相关阅读:
    JSP+JDBC+Servlet--基于数据库的登陆验证
    简单的购物车设计
    控制网页的访问时间
    JSP+JavaBean设计模式
    关于doGet和doPost的疑问
    IDEA连接SQL Server
    no sqljdbc_auth in java.library.path com.microsoft.sql 没有为集成身份验证配置驱动程序。
    数组的属性排序
    关于AFNetworking的Assertion failure崩溃
    C++中static关键字作用总结
  • 原文地址:https://www.cnblogs.com/xiaoshi3003/p/3784174.html
Copyright © 2011-2022 走看看