Reproducción+de+audio+sobre+Android

=Reproducción de audio sobre Android=

En esta Wiki trataremos el tema de la reproducción de música en Android para dispositivos móviles o portátiles usando MediaPlayer.

1. Preámbulo
Antes de empezar debemos crear un proyecto Android. Para esta Wiki se ha usado el entorno ADT, que se puede descargar desde aquí.

Una vez creado el proyecto, debemos incluir los archivos de audio que vamos a reproducir: Necesitaremos crear una nueva carpeta llamada "**raw**", bajo el directorio "**res**" de nuestro proyecto. Será en esta carpeta donde incluyamos dichos archivos. MediaPlayer reconoce un buen abanico de archivos de audio (visitar esta página); aunque para este tutorial se supone que se reproducirán archivos MP3.

2. Reproductor
Utilizaremos MediaPlayer, reproductor estándar del framework de Android. Este reproductor dispone de la suficiente documentación y uso por parte de los usuarios como para facilitar el uso del mismo en este tipo de aplicaciones.

3. Interfaz de la aplicación
En la aplicación desarrollada se han usado dos pistas de audio MP3, que se pueden **seleccionar** en la actividad principal de la aplicación como un grupo de botones "radio". Para la reproducción de sendas canciones se dispone de dos botones:


 * Un botón Play/Pause, que permite reproducir por primera vez una canción o bien pausarla/reanudarla.
 * Otro botón Stop, que pasa el reproductor al estado Stopped (parado).

Podéis ver toda la aplicación desde GitHub pinchando aquí. Los distintos estados del reproductor se pueden encontrar en esta página.

4. Aplicación
En primer lugar declaramos la variable que se corresponderá con el **reproductor**: code format="java" private MediaPlayer reproductor; code

Una vez declarada, creamos el reproductor con el constructor por defecto:

code format="java" reproductor = new MediaPlayer; code

El siguiente paso es cambiar el estado del reproductor según los cambios que el usuario produzca en la interfaz. Para ello usaremos el método setOnClickListener(...) de la clase View:

code format="java" reproducir.setOnClickListener(new View.OnClickListener {  ... }); code

En este caso la variable "**reproducir**" referencia al botón Play/Pause del que hablamos unas líneas más arriba.

De este modo, cada vez que se haga click en el botón reproducir, se ejecutará el código que se encuentre entre ambos corchetes: code format="java" @Override public void onClick(View v) {

if (radioG.getCheckedRadioButtonId == R.id.radio0) { code

El método onClick es sobreescrito con este nuevo código. En este caso concreto, dependiendo de qué botón radio esté seleccionado en el grupo, operaremos sobre una u otra pista. Este trozo de código se puede replicar (a modo } else if {...}) para todos los botones radio que deseemos.

code format="java" if (reproductor.isPlaying) { reproductor.pause; pausado = true;

} else {

try {

if (!pausado){ AssetFileDescriptor afd = NPIAudioActivity.this.getResources.openRawResourceFd( R.raw.cancion1); reproductor.reset;

reproductor.setDataSource(afd.getFileDescriptor, afd.getStartOffset, afd.getDeclaredLength);

reproductor.prepare; }

reproductor.start; pausado = false; } code

El método **isPlaying** del objeto reproductor devuelve true si actualmente está reproduciendo alguna canción. Como el botón reproducir se comporta como Play/Pause, usaremos este resultado para pausar la pista si está en marcha. Si no es así se debe a que, el reproductor está en uno de los tres estados siguientes:


 * __Paused__: Si el reproductor está en estado Paused, sólo hay que llamar al método **start** para que siga con la reproducción.
 * __Idle o Stopped__: Si se encuentra en alguno de estos estados; deberemos resetear y preparar (de forma síncrona) al reproductor, para que seguidamente pueda reproducir la pista seleccionada, cuyos datos se obteienen por el descriptor de archivo **afd**.

La variable booleana **pausado** es la que se encarga de reflejar este comportamiento. code format="java" catch (IllegalArgumentException e) { Log.e("001", "Excepción en el argumento: " + e.getMessage, e); }

catch (IllegalStateException e) { Log.e("002", "Excepción en el estado: " + e.getMessage, e); }

catch (IOException e) { Log.e("003", "Excepción de entrada/salida: " + e.getMessage, e); }

code

Los métodos anteriores pueden lanzar excepciones que deberemos controlar con bloques try{...} catch{...}.

code format="java" detener.setOnClickListener (new View.OnClickListener {

@Override public void onClick(View v) {

reproductor.stop; pausado = false; }

}); code

Por último, necesitamos programar el botón que permite detener la reproducción de audio y hacer que el reproductor pase a estado Stopped. El botón **detener**, usando el método setOnClickListener implementa esta funcionalidad como vemos arriba. La estructura general es la misma que para el botón reproducir, aunque claramente se ejecutan distintas sentencias.

NOTA: Los trozos de código incrustados son meramente explicativos, para encontrar código completamente funcional, ir al enlace de GitHub.

5. Referencias

 * []
 * []
 * []
 * []
 * []
 * []