情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

システム メディア トランスポート コントロールの使用方法 (XAML)

Applies to Windows and Windows Phone

SystemMediaTransportControls クラスは、Windows によって提供されるシステム メディア トランスポート コントロールをアプリで使用できるようにし、表示されるメディア情報を更新します。

完全なメディア再生のサンプルで実際にこの機能を確認するには、「メディア再生の概要」を参照してください。

概要

Windows 8.1 で導入された SystemMediaTransportControls クラスは、前の MediaControl クラスに代わるものです。 新しい SystemMediaTransportControls を、MediaControl の代わりに使ってください。

システム トランスポート コントロールは、MediaElement オブジェクトのトランスポート コントロールとは異なります。 システム トランスポート コントロールは、ヘッドホンのボリューム コントロールやキーボードのメディア ボタンなどのハードウェア メディア キーを押すとポップアップするコントロールです。ユーザーがキーボードの一時停止キーを押し、アプリが SystemMediaTransportControls をサポートしている場合、アプリは通知を受け取り、ユーザーは適切なアクションを実行できます。

アプリでは、SystemMediaTransportControls に表示される曲のタイトル、サムネイル画像などのメディア情報も更新できます。

トランスポート コントロールの設定

SystemMediaTransportControls のインスタンスを取得するには、GetForCurrentView を呼び出します。

アプリで処理するボタンを有効にするには、対応する SystemMediaTransportControls オブジェクトの "is enabled" プロパティ (IsPlayEnabledIsPauseEnabledIsNextEnabledIsPreviousEnabled など) を設定します。 全一覧については、SystemMediaTransportControls のリファレンス ドキュメントをご覧ください。

MediaElement オブジェクトを作成し、SystemMediaTransportControls を設定するコードを示します。このコードにより、再生ボタンと一時停止ボタンを有効にし、ButtonPressed イベントのイベント ハンドラーを追加します。MediaOpenedCurrentStateChanged のイベント ハンドラーについては、この例で後述します。


<MediaElement x:Name="musicPlayer" 
              Source="Music/music1.mp3"
              CurrentStateChanged="MusicPlayer_CurrentStateChanged"
              MediaOpened="MusicPlayer_MediaOpened"/>



SystemMediaTransportControls systemControls;

public MainPage()
{
    this.InitializeComponent();

    // Hook up app to system transport controls.
    systemControls = SystemMediaTransportControls.GetForCurrentView();
    systemControls.ButtonPressed += SystemControls_ButtonPressed;

    // Register to handle the following system transpot control buttons.
    systemControls.IsPlayEnabled = true;
    systemControls.IsPauseEnabled = true;
}


トランスポート コントロールとの通信

トランスポート コントロールを使う場合は、3 つの通信要素があります。

SystemMediaTransportControls は、有効なボタンの 1 つが押されたときに ButtonPressed イベントを介してアプリに通知します。アプリは、押されたボタンに応答して、一時停止、再生など、メディアを制御します。

アプリは、メディアの状態が変更されたときに PlaybackStatus プロパティを介して SystemMediaTransportControls に通知します。これによりトランスポート コントロールでメディア ソースの状態に合わせてボタンの状態を更新することができます。

SystemMediaTransportControlsDisplayUpdater で、曲のタイトルやアルバム アートなど、トランスポート コントロールに表示されるメディア情報を更新できます。

ボタン入力の処理

ButtonPressed イベントは、有効なボタンの 1 つが押されたときにシステム トランスポート コントロールで発生します。 SystemMediaTransportControlsButtonPressedEventArgsButton プロパティは、どのボタンが押されたかを特定します。

ButtonPressed イベント ハンドラーから UI スレッド上のオブジェクトを更新するには、MediaElement オブジェクトと同じように、CoreDispatcher を介して呼び出しをマーシャリングする必要があります。 これは ButtonPressed イベント ハンドラーは、UI スレッドから呼び出されないためです。 UI スレッドでのみ、UI スレッド上のオブジェクトを変更することができます。 UI スレッド以外から UI オブジェクトを変更しようとすると、例外がスローされます。 以下のコード例で、この方法を示しています。

MediaElement の再生と一時停止を行うヘルパー メソッドと ButtonPressed イベント ハンドラーを作成するコードを次に示します。PlayPause の呼び出しは、Dispatcher.RunAsync を使った CoreDispatcher を介して UI スレッドにマーシャリングされます。


void SystemControls_ButtonPressed(SystemMediaTransportControls sender, 
    SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            PlayMedia();
            break;
        case SystemMediaTransportControlsButton.Pause:
            PauseMedia();
            break;
        default:
            break;
    }
}

async void PlayMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Play();
    });
}

async void PauseMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Pause();
    });
}


メディアの状態の更新

メディアの状態が変更されたことを SystemMediaTransportControls に通知するには、PlaybackStatus を適切な MediaPlaybackStatus の値に設定します。

更新通知は、メディアの状態が変更されたときに発生する MediaElementCurrentStateChanged イベントで処理することをお勧めします。

CurrentStateChanged イベント ハンドラーを処理し、SystemMediaTransportControlsPlaybackStatus プロパティを更新するコードを示します。


void MusicPlayer_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (musicPlayer.CurrentState)
    {
        case MediaElementState.Playing:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}


メディア情報とサムネイルの更新

SystemMediaTransportControlsDisplayUpdater クラスを使って、曲のタイトルやアルバム アートなど、トランスポート コントロールに表示されるメディア情報を更新します。

DisplayUpdater プロパティは SystemMediaTransportControls に関連付けられている SystemMediaTransportControlsDisplayUpdater です。

MusicPropertiesImagePropertiesVideoProperties のメディア プロパティを設定して、メタデータを手動で更新できます。ただし、ファイルからメタデータとサムネイル イメージを自動的に抽出する CopyFromFileAsync メソッドにメディア ファイルを渡す方がはるかに簡単でありお勧めです。

表示するすべてのメディア情報を設定している場合、Update を呼び出します。UI は、Update が呼び出されるまで更新されません。

Windows.Storage.StorageFileWindows.Storage.Streams.RandomAccessStreamReference は、メディア情報の操作に便利な静的メソッドを提供します。

StorageFile

RandomAccessStreamReference

音楽ファイルで曲のメタデータを更新し、サムネイル画像を更新するコードを示します。MediaOpened イベント ハンドラーは、更新を開始するためのヘルパー メソッドを呼び出すために使われます。 この例では、アプリに埋め込まれたメディア ファイルにハードコードします。実際のアプリでは、ネットワークまたはローカル ファイル システムからメディア ファイルを取得することがほとんどです。この場合、GetFileFromPathAsyncCreateFromStreamCreateFromFile がファイルやストリーム オブジェクトを取得するのにより有用です。


async private void UpdateSongInfo()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Get the music file and pass it to CopyFromFileAsync to extract the metadata
    // and thumbnail. StorageFile is defined in Windows.Storage
    StorageFile musicFile =
        await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Music/music1.mp3"));
    
    await updater.CopyFromFileAsync(MediaPlaybackType.Music, musicFile);

    // Update the system media transport controls
    updater.Update();
}

void MusicPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
    UpdateSongInfo();
}


メタデータとサムネイルを手動で更新する方法を示すコードを次に示します。


/// <summary>
/// Shows how to update the media metadata and thumbnail manually.
/// Normally you would probably retreive this info from a source such as a database
/// but for this simple sample we'll just set the metadata with strings.
/// </summary>
void UpdateSongInfoManually()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Music metadata.
    updater.MusicProperties.AlbumArtist = "artist";
    updater.MusicProperties.AlbumArtist = "album artist";
    updater.MusicProperties.Title = "song title";

    // Set the album art thumbnail.
    // RandomAccessStreamReference is defined in Windows.Storage.Streams
    updater.Thumbnail =
       RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Music/music1_AlbumArt.jpg"));

    // Update the system media transport controls.
    updater.Update();
}


バックグラウンド オーディオ

オーディオをバックグラウンドで再生するには、アプリでは、IsPlayEnabledIsPauseEnabledtrue に設定して、再生ボタンと一時停止ボタンを有効にする必要があります。アプリは、ButtonPressed イベントも処理する必要があります。バックグラウンドでオーディオを再生するためのすべての要件について詳しくは、「バックグラウンドでオーディオを再生する方法」をご覧ください。

完全なコードの一覧

このトピックで紹介したすべてのスニペットの完全なコードの一覧を次に示します。


<MediaElement x:Name="musicPlayer" 
              Source="Music/music1.mp3"
              CurrentStateChanged="MusicPlayer_CurrentStateChanged"
              MediaOpened="MusicPlayer_MediaOpened"/>



SystemMediaTransportControls systemControls;

public MainPage()
{
    this.InitializeComponent();

    // Hook up app to system transport controls.
    systemControls = SystemMediaTransportControls.GetForCurrentView();
    systemControls.ButtonPressed += SystemControls_ButtonPressed;

    // Register to handle the following system transpot control buttons.
    systemControls.IsPlayEnabled = true;
    systemControls.IsPauseEnabled = true;
}

void MusicPlayer_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (musicPlayer.CurrentState)
    {
        case MediaElementState.Playing:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}

void SystemControls_ButtonPressed(SystemMediaTransportControls sender, 
    SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            PlayMedia();
            break;
        case SystemMediaTransportControlsButton.Pause:
            PauseMedia();
            break;
        default:
            break;
    }
}

async void PlayMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Play();
    });
}

async void PauseMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Pause();
    });
}

async private void UpdateSongInfo()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Get the music file and pass it to CopyFromFileAsync to extract the metadata
    // and thumbnail. StorageFile is defined in Windows.Storage
    StorageFile musicFile =
        await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Music/music1.mp3"));
    
    await updater.CopyFromFileAsync(MediaPlaybackType.Music, musicFile);

    // Update the system media transport controls
    updater.Update();
}

void MusicPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
    UpdateSongInfo();
}
/// <summary>
/// Shows how to update the media metadata and thumbnail manually.
/// Normally you would probably retreive this info from a source such as a database
/// but for this simple sample we'll just set the metadata with strings.
/// </summary>
void UpdateSongInfoManually()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Music metadata.
    updater.MusicProperties.AlbumArtist = "artist";
    updater.MusicProperties.AlbumArtist = "album artist";
    updater.MusicProperties.Title = "song title";

    // Set the album art thumbnail.
    // RandomAccessStreamReference is defined in Windows.Storage.Streams
    updater.Thumbnail =
       RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Music/music1_AlbumArt.jpg"));

    // Update the system media transport controls.
    updater.Update();
}


関連トピック

SystemMediaTransportControls のサンプル
バックグラウンドでオーディオを再生する方法
クイック スタート: 動画とオーディオ
メディア再生の概要

 

 

表示:
© 2014 Microsoft