Cómo reproducir audio de fondo en Windows Phone
Este tema muestra cómo crear una aplicación de Windows Phone para Windows Phone 7.5 que continúe reproduciendo audio incluso cuando la aplicación ya no se esté ejecutando en primer plano. Hay dos tipos de aplicaciones de audio de fondo. Uno reproduce medios locales y el otro reproduce medios de transmisión. Este artículo describe cómo implementar una aplicación de Windows Phone que utiliza un proxy de reproducción de audio para reproducir medios locales.
Consejo:
Para obtener una descripción arquitectónica de la aplicación de audio de fondo, consulte Descripción general del audio de fondo para Windows Phone. Esta descripción general también incluye las mejores prácticas a seguir al implementar su aplicación.
Cómo reproducir audio de fondo
Para reproducir audio de fondo, cree un "Audio de Windows Phone" en Visual Studio usando la plantilla de proyecto Silverlight para Windows Phone Play Agente". Luego, haga referencia al proxy en segundo plano de su aplicación.
Consejo:
Para obtener más información sobre la reproducción de audio de fondo en aplicaciones de Windows Phone, descargue el ejemplo de Reproductor de audio de fondo y Audio de fondo desde la página de ejemplos de código para el ejemplo de Streamer de Windows Phone.
Nota importante:
Este artículo requiere el uso del SDK de Windows Phone. Consulte Instalación del SDK de Windows Phone.
Crea una aplicación de audio de fondo para Windows Phone
Crea un nuevo proyecto seleccionando el comando de menú "Archivo | Nuevo proyecto...".
Aparecerá el cuadro de diálogo Nuevo proyecto. Expanda la plantilla "Visual C#" y seleccione la plantilla "Silverlight para Windows Phone".
Selecciona la plantilla "Aplicación Windows Phone". Complete el Nombre según sea necesario y haga clic en Aceptar.
Seleccione Windows Phone 7.1 como versión de destino y haga clic en Aceptar.
En el Explorador de soluciones, haga clic derecho en el nodo Soluciones y seleccione Agregar | Nuevo proyecto....
En el cuadro de diálogo Agregar nuevo elemento, haga clic en Agente de reproducción de audio de Windows Phone.
Rellene el Nombre según sea necesario y haga clic en Aceptar.
Su solución ahora debería tener dos proyectos, el proyecto de aplicación y el proyecto de agente en segundo plano.
En el cuadro de diálogo Agregar referencia, haga clic en la pestaña Proyecto. Seleccione el proxy backend que creamos anteriormente y haga clic en Aceptar.
Agregar archivos de audio
En el Explorador de soluciones, haga clic derecho en el proyecto de la aplicación y seleccione Agregar nueva carpeta. Nombra la carpeta Audio.
Haga clic derecho en la carpeta Audio que acaba de crear y seleccione "Agregar | Elemento existente..." en el menú contextual.
En el cuadro de diálogo Agregar elemento existente, navegue hasta "%PUBLIC%\Music\Sample Music" (generalmente C:\Users\Public\Music\Sample Music) y seleccione varios documentos de audio. Para obtener información sobre los formatos de archivo admitidos por el reproductor de audio de fondo, consulte Códecs multimedia compatibles con Windows Phone.
Haga clic en el botón "Agregar".
En el Explorador de soluciones, seleccione todos los archivos de audio que acaba de agregar en el directorio Audio. En el panel Propiedades, cambie el campo Copiar al directorio de salida de "No copiar" a "Copiar si es más nuevo".
Crear interfaz de usuario
La aplicación tiene una interfaz de usuario muy sencilla.
En el Explorador de soluciones, haga doble clic en MainPage.xaml para abrirlo en el Diseñador/Editor XAML.
Reemplace el elemento StackPanel llamado TitlePanel con el siguiente código XAML:
3. Reemplace el elemento Grid llamado ContentPanel con este código XAML:
¿StackPanel? Elemento muy conveniente para organizar botones. En este ejemplo, organizamos los botones horizontalmente configurando la propiedad Orientación en consecuencia.
4. La interfaz de usuario en el diseñador debería verse así:
Modifique el archivo de código subyacente de la interfaz de usuario
En "Explorador de soluciones", Haga clic derecho en "MainPage.xaml" y seleccione Ver código en el menú contextual.
Agregue la siguiente instrucción ?using? en la parte superior del archivo MainPage.xaml.cs:
C#
using System.Windows.Navigation; p>
usando Microsoft.Phone.BackgroundAudio;
Agregue el siguiente código de controlador de eventos de clic de botón a la clase MainPage en MainPage.xaml.cs:
C#
#region Controladores de eventos de clic de botón
private void prevButton_Click(remitente del objeto, RoutedEventArgs e)
{
BackgroundAudioPlayer.Instance.SkipPrevious();
}
privado void playButton_Click(objeto remitente, RoutedEventArgs e)
{
if (PlayState.Playing == BackgroundAudioPlayer.Instance. PlayerState)
{
BackgroundAudioPlayer.Instance.Pause();
}
else
{
BackgroundAudioPlayer.Instance.Play();
}
}
private void nextButton_Click(remitente del objeto, RoutedEventArgs e)
{
BackgroundAudioPlayer.Instance.SkipNext();
}
#endregion Controladores de eventos de clic de botón
Tenga en cuenta , el controlador playButton_Click? en realidad cambia entre reproducción y pausa según el estado actual de reproducción.
En el constructor de la clase MainPage, agregue un controlador de eventos para el evento PlayStateChanged.
C#
BackgroundAudioPlayer.Instance.PlayStateChanged += new EventHandler(Instance_PlayStateChanged);
Implemente el método ?Instance_PlayStateChanged de la siguiente manera:
C#
void Instance_PlayStateChanged(remitente del objeto, EventArgs e)
{
interruptor (BackgroundAudioPlayer.Instance.PlayerState)
{
?case PlayState.Playing:
playButton.Content = "pausa";
pausa;
?case PlayState.Paused:
?case PlayState.Stopped:
playButton.Content = "reproducir";
pausa;
}
if (null != BackgroundAudioPlayer.Instance.Track)
{
?txtCurrentTrack.Text = BackgroundAudioPlayer.Instance.Track.Title +
" por " +
BackgroundAudioPlayer.Instance.Track.Artist;
}
}
Dado que la aplicación está diseñada para reproducir audio en segundo plano , Por lo que el usuario podrá volver a la aplicación mientras se reproduce el audio. La interfaz de usuario debe mostrar este contenido actualizándose en consecuencia para reflejar el estado actual de reproducción y la pista que se está reproduciendo actualmente.
Para actualizar la interfaz de usuario cuando se carga la aplicación, anule el método virtual OnNavigatedTo agregando el siguiente código a la clase MainPage en MainPage.xaml.cs:
C#
protected override void OnNavigatedTo (NavigationEventArgs e)
{
if (PlayState.Playing == BackgroundAudioPlayer.Instance.PlayerState)
{
playButton.Content = "pausa";
txtCurrentTrack.Text = BackgroundAudioPlayer.Instance.Track.Title +
" por " +
BackgroundAudioPlayer.Instance.Track .Artist;
}
else
{
playButton.Content = "reproducir";
txtCurrentTrack .Text = "";
}
}
En el Explorador de soluciones, haga clic derecho en App.xaml y seleccione Seleccionar "Ver código" en el menú contextual.
Agregue la siguiente instrucción ?using? a App.xaml.cs:
C#
using System.IO.IsolatedStorage;
usando System.Windows.Resources;
BackgroundAudioPlayer? solo puede reproducir archivos en almacenamiento independiente o URI remoto. Agregue el siguiente método a la clase App. Asegúrese de que la matriz de archivos contenga los nombres reales de los archivos de audio que agregó al proyecto.
C#
vacío privado CopyToIsolatedStorage()
{
usando (almacenamiento IsolatedStorageFile = InsulatedStorageFile.GetUserStoreForApplication())
{
string[] files = new string[] { "Kalimba.mp3", "La criada del cabello rubio.mp3", "Sleep Away.mp3" };
foreach (var _fileName en archivos)
{
if (!storage.FileExists(_fileName))
{
cadena _filePath = "Audio/" + _fileName;
recurso StreamResourceInfo = Application.GetResourceStream(new Uri(_filePath, UriKind.Relative));
usando (archivo IsolatedStorageFileStream = almacenamiento.CreateFile( _fileName))
{
int chunkSize = 4096;
byte[] bytes = nuevo byte[chunkSize];
int byteCount ;
while ((byteCount = recurso.Stream.Read(bytes, 0, chunkSize)) > 0)
{
archivo.Write(bytes, 0, byteCount);
}
}
}
}
}
}
Agregue una llamada al método CopyToIsolatedStorage al constructor de la clase App.
C#
// Copiar medios a un almacenamiento aislado.
CopyToIsolatedStorage();
¿Se utiliza AudioPlayerAgent cuando el usuario cambia a? otras interfaces La aplicación continúa ejecutándose como parte de la aplicación en segundo plano.
Implementación del proxy del reproductor de audio
En el Explorador de soluciones, haga doble clic en AudioPlayer.cs en el proyecto proxy para abrir el archivo en el editor de código.
Agregue la siguiente declaración ?using? en la parte superior de AudioPlayer.cs:
C#
using System.Collections.Generic;
En En la clase AudioPlayer del archivo AudioPlayer.cs, declare un entero estático en el nivel de alcance de la clase. Esta variable contiene el número de pista actual.
C#
// ¿Cuál es la pista actual?
static int currentTrackNumber = 0;
Pasando ?AudioPlayer a AudioPlayer. cs ?Agregue el siguiente código a la clase para crear una lista estática de pistas:
C#
// Una lista de reproducción compuesta por elementos AudioTrack.
privada Lista estática
{
nueva AudioTrack(nueva Uri("Kalimba.mp3", UriKind.Relative),
"Kalimba",
"Mr. Scruff",
"Ninja Tuna",
null),
nueva AudioTrack( new Uri("La doncella del cabello rubio.mp3", UriKind.Relative),
"La doncella del cabello rubio",
"Richard Stoltzman",
"Fine Music, Vol. 1",
null),
new AudioTrack(new Uri("Sleep Away.mp3", UriKind.Relative),
"Duerme lejos",
"Bob Acri",
"Bob Acri",
null),
/ / Un URI remoto
new AudioTrack(new Uri("/wpradio/WPRadio_29.mp3", UriKind.Absolute),
"Episodio 29",
"Windows Phone Radio" ,
"Windows Phone Radio Podcast",
null)
};
Porque la lista está declarada en el alcance de la clase, así que asegúrese de especificarlo como estático para que la lista no se vuelva a crear cada vez que se llame a nuestro agente.
Para controlar las acciones del usuario, como hacer clic en los botones Reproducir, Siguiente y Anterior, agregue los siguientes tres métodos a la clase AudioPlayer en AudioPlayer.cs:
C#
privado void PlayNextTrack(reproductor BackgroundAudioPlayer)
{
if (++currentTrackNumber >= _playList.Count)
{
currentTrackNumber = 0;
}
PlayTrack(jugador);
}
privado void PlayPreviousTrack(reproductor BackgroundAudioPlayer)
{
if (--currentTrackNumber < 0)
{
currentTrackNumber = _playList Count - 1;
. }
PlayTrack(reproductor);
}
privado void PlayTrack(reproductor BackgroundAudioPlayer)
{
// Establece la pista para reproducir Cuando se recibe el estado TrackReady,
// la reproducción comienza desde el controlador OnPlayStateChanged.
player .Track = _playList[currentTrackNumber];
}
Para manejar los cambios de estado de reproducción, agregue la siguiente instrucción de cambio al método OnPlayStateChanged en la llamada a NotifyComplete antes de llamar:
C#
switch (playState)
{
?case PlayState.TrackReady:
// La pista a reproducir se establece en el método PlayTrack.
player.Play();
descanso;
?case PlayState.TrackEnded: p>
PlayNextTrack(jugador);
descanso ;
}
Para manejar las acciones del usuario, agregue lo siguiente a la instrucción switch? del método ?OnUserAction?, colocada antes de la llamada a ?NotifyComplete?:
C#
cambiar (acción)
{
?case UserAction.Play:
PlayTrack(jugador);
descanso;
?case UserAction.Pause:
player.Pause() ;
descanso;
?case UserAction .SkipPrevious:
PlayPreviousTrack(jugador);
descanso;
?case UserAction.SkipNext:
PlayNextTrack(jugador);
descanso;
}
Este es todo el código necesario para implementar una aplicación muy básica que reproduce audio en segundo plano. La aplicación se ejecutará desde la pantalla de bloqueo y el Control de volumen universal (UVC) puede incluso controlar la reproducción desde la aplicación. Por supuesto, también puede implementar más funciones, como una interfaz de usuario más rica, soporte para reproducir audio desde fuentes remotas utilizando el URI web del archivo de audio y más. Aún no hemos implementado soporte para operaciones de usuario como detener, avanzar rápido, rebobinar y buscar.