首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Windows 8 應用開發實戰:掌握背景音樂播放與系統媒體控制整合

     編輯:關於.NET

前言

在 Windows 8 應用開發中,背景任務是實現多任務處理的關鍵機制。本文深入探討如何利用 MediaControl 類別實現音樂的背景播放與控制,讓使用者即使切換到其他應用或鎖定螢幕時,仍能透過系統媒體控制介面(如音量鍵、耳機按鈕)操作播放、暫停、上一首、下一首等功能。

核心架構與關鍵類別

SongModel - 音樂資料模型

首先定義一個用於封裝音樂檔案元資料的模型類別:

using System;
using System.Threading.Tasks;
using Windows.Storage;

namespace XamlDemo.BackgroundTask
{
    public class SongModel
    {
        public StorageFile File { get; private set; }
        public string Artist { get; private set; }
        public string Title { get; private set; }

        public SongModel(StorageFile file)
        {
            File = file;
        }

        public async Task LoadMusicPropertiesAsync()
        {
            var properties = await File.Properties.GetMusicPropertiesAsync();
            Artist = properties.Artist;
            Title = properties.Title;
        }
    }
}

MediaControlDemo - 主要示範頁面

XAML 介面包含檔案選取、播放控制按鈕,以及關鍵的 MediaElement 設定:

<MediaElement Name="mediaElement" 
              AudioCategory="BackgroundCapableMedia" 
              AutoPlay="False" 
              MediaOpened="mediaElement_MediaOpened" 
              MediaEnded="mediaElement_MediaEnded" 
              CurrentStateChanged="mediaElement_CurrentStateChanged" />

關鍵點: 必須將 AudioCategory 設為 BackgroundCapableMedia,才能支援背景播放。

MediaControl 事件處理完整實作

在頁面建構子中註冊所有媒體控制事件:

public MediaControlDemo()
{
    this.InitializeComponent();
    
    MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
    MediaControl.PlayPressed += MediaControl_PlayPressed;
    MediaControl.PausePressed += MediaControl_PausePressed;
    MediaControl.StopPressed += MediaControl_StopPressed;
    MediaControl.PreviousTrackPressed += MediaControl_PreviousTrackPressed;
    MediaControl.NextTrackPressed += MediaControl_NextTrackPressed;
    MediaControl.RewindPressed += MediaControl_RewindPressed;
    MediaControl.FastForwardPressed += MediaControl_FastForwardPressed;
    MediaControl.SoundLevelChanged += MediaControl_SoundLevelChanged;
    
    _previousTrackPressedRegistered = true;
    _nextTrackPressedRegistered = true;
}

播放/暫停切換邏輯

async void MediaControl_PlayPauseTogglePressed(object sender, object e)
{
    if (MediaControl.IsPlaying)
    {
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => mediaElement.Pause());
        await OutputMessage("Play/Pause Pressed - Pause");
    }
    else
    {
        await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => mediaElement.Play());
        await OutputMessage("Play/Pause Pressed - Play");
    }
}

上一首/下一首導航與動態事件管理

示範如何根據播放清單位置動態啟用或停用上一首、下一首按鈕:

async void MediaControl_PreviousTrackPressed(object sender, object e)
{
    await OutputMessage("Previous Track Pressed");
    if (_currentSongIndex > 0)
    {
        if (_currentSongIndex == (_playList.Count - 1))
        {
            if (!_nextTrackPressedRegistered)
            {
                MediaControl.NextTrackPressed += MediaControl_NextTrackPressed;
                _nextTrackPressedRegistered = true;
            }
        }
        _currentSongIndex--;
        if (_currentSongIndex == 0)
        {
            MediaControl.PreviousTrackPressed -= MediaControl_PreviousTrackPressed;
            _previousTrackPressedRegistered = false;
        }
        await SetCurrentPlayingAsync(_currentSongIndex);
    }
}

必要的應用程式清單設定

在 Package.appxmanifest 中必須宣告背景任務並勾選「音訊」類型:

  • 擴充功能 → 背景任務 → 音訊
  • 進入點設為對應的背景任務類別

完整程式碼結構

專案包含以下核心檔案:

  • BackgroundTask/SongModel.cs - 音樂資料模型
  • BackgroundTask/MediaControlDemo.xaml - 使用者介面
  • BackgroundTask/MediaControlDemo.xaml.cs - 邏輯實作

開發重點總結

  1. AudioCategory 設定正確:BackgroundCapableMedia 是背景播放的前提
  2. Manifest 宣告完整:缺少背景任務宣告將導致背景播放失效
  3. UI 執行緒切換:所有媒體控制操作必須透過 Dispatcher.RunAsync 回到 UI 執行緒
  4. 狀態同步:需維護 MediaControl.IsPlaying、TrackName、ArtistName 等屬性與實際播放狀態同步
  5. 動態事件管理:根據播放清單位置啟用/停用上一首、下一首事件,避免無效操作

原始碼下載:Windows8.rar

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved