Search code examples
c#windowswin-universal-appbackground-audio

What's the easiest way to play audio in background in UWP?


I am working on my Project (a soundcloud client) and the app can play tracks just fine, but not when the app is minimized. I use the MediaElement-Object for playing the mp3 from the url. How can i force the music to continue playing the music, when the app is in the background. Or whats the easiest way/best explained tutorial to implement this. I searched alot for a good answer, but the ones, i found, was too good for me :D What means, that i didn't understand it.


Solution

  • To play audio in the background you will have to do a Declaration in Package.appxmanifest for a Background Tasks, enable audio and add an entry point like TestUWP.MainPage page.

    enter image description here

    Also for the user to easily be able to manage the audio you can use SystemMediaTransportControls

    Here is a basic setup with Play and Pause.

    xaml

    <MediaElement x:Name="mediaElement" Height="100" Width="100" AreTransportControlsEnabled="True"/>
    

    C#

    public MainPage()
    {
        this.InitializeComponent();
    
        systemControls = SystemMediaTransportControls.GetForCurrentView();
    
        // Register to handle the following system transpot control buttons.
        systemControls.ButtonPressed += SystemControls_ButtonPressed;
    
        mediaElement.CurrentStateChanged += MediaElement_CurrentStateChanged;
    
    
        systemControls.IsPlayEnabled = true;
        systemControls.IsPauseEnabled = true;
    }
    
    private void MediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
    {
        switch (mediaElement.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;
            case SystemMediaTransportControlsButton.Stop:
                StopMedia();
                break;
            default:
                break;
        }
    }
    
    private async void StopMedia()
    {
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            mediaElement.Stop();
        });
    }
    
    async void PlayMedia()
    {
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            if (mediaElement.CurrentState == MediaElementState.Playing)
                mediaElement.Pause();
            else
                mediaElement.Play();
        });
    }
    
    async void PauseMedia()
    {
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            mediaElement.Pause();
        });
    }
    

    Output

    Output

    If you like to enable more controls you can do using the available properties for ex.

    systemControls.IsNextEnabled = true;

    and you have to add the case in the button switch.

    case SystemMediaTransportControlsButton.Next:
                        //handle next song
                        break;