Desarrollo de aplicaciones multiplataforma: las librerías multimedia integradas
11/10/2017
Carlos Yañez

Desarrollo de aplicaciones multiplataforma: las librerías multimedia integradas

Informática y Tecnología

El framework multimedia de Android incluye soporte para la reproducción de varios tipos de medios, de forma que se puede integrar fácilmente audio, video e imágenes en las aplicaciones. En el post de hoy comentaremos cómo usar estas librerías multimedia que vienen incorporadas en el framework de desarrollo de Android.

Librerías multimedia integradas

El framework multimedia de Android dispone de las siguientes clases para poder reproducir ficheros multimedia:

  • Media Player: que es una API más bien básica para reproducir audio y video

  • AudioManager: capaz de gestionar diferentes fuentes de audio, así como la salida del dispositivo.

Con estas clases, podremos reproducir audio o video de los archivos multimedia almacenados en los recursos de la aplicación, a partir de archivos independientes en el sistema de archivos, o de un flujo de datos que llega a través de una conexión de red.

Hay una serie de declaraciones que deberemos realizar en el framework en función del uso que queramos hacer de estas clases.

Si nos interesa realizar streaming, deberemos dar en ambos casos permisos de acceso a Internet. Para ello, daremos los permisos de la siguiente forma:

<uses-permission android:name="android.permission.INTERNET" />

Si por otro lado la aplicación tiene que mantenerse en pantalla o utiliza MediaPlayer.setScreenOnWhilePlaying() o bien los métodos MediaPlayer.setWakeMode(), deberemos asignarle los siguientes permisos:

<uses-permission android:name="android.permission.WAKE_LOCK" />

Uso de Media Player

Veremos a continuación cómo poder usar la clase MediaPlayer, pues con la misma ya podremos hacer uso de diversas opciones multimedia en nuestros desarrollos.

Un objeto de la clase MediaPlayer permite obtener, decodificar y reproducir audio y video. Además, soporta orígenes multimedia locales, URL internas, listas de audio, fotos... y URLs externas (streaming). Si queremos detalle sobre los diferentes formatos multimedia que soporta la clase, los podemos consultar en el siguiente enlace.

Veamos ahora cómo podemos reproducir un fichero de audio o video que tenemos de forma local. Para ello, es tan sencillo como ubicar nuestro fichero en el siguiente directorio de nuestro dispositivo Android /res/raw.

Para la ejecución, si por ejemplo el fichero que queremos reproducir se llama audio1.mp3, bastará con crear el objeto tipo MediaPlayer y ejecutarlo:

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.audio1);
mediaPlayer.start();

Si por el contrario nos interesa la reproducción de streaming desde una URL, por ejemplo crearemos igualmente crearemos el objeto, pero indicando que es streaming.

String url = "http://www.streamingurl.com";
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // puede tardar ya que carga en el buffer.
mediaPlayer.start();

Tenemos que tener en cuenta que el método prepare() no se puede llamar nunca desde el hilo de la GUI (Interface Grafica de Usuario) ya que puede bloquear la aplicación.Imaginemos que desarrollas una app y quieres música de fondo, si lo haces directamente en la activity bloquearía la interface hasta que se cargue el buffer.

La solución es crear un nuevo hilo para preparar MediaPlayer y que notifique al hilo principal cuando esté preparado. Existe un método llamado prepareAsync() que crearía un servicio de forma automática. Hará falta un listener OnPreparedListener, que llamará al callback onPrepared() y se disparará cuando esté preparado. Una vez se ha utilizado un medio, es necesario liberar los recursos con el método release().

Es importante que se tenga en cuenta que cuando el usuario cambia la orientación, se vuelve a crear un objeto MediaPlayer, porque se vuelve a llamar a onCreate(), y por este motivo se necesita liberar los recursos.

media.release();
media=null;

Uso de Servicios

Los servicios son componentes de una aplicación que realizan operaciones de larga duración que no requieren la interacción de un usuario, o que ofrecen funcionalidades para otras aplicaciones. Normalmente envían correos, sincronizan datos o reproducen medios. Es recomendable crear un servicio para gestionar los eventos que se puedan generar asociados a MediaPlayer. Los servicios procesan las intenciones intents de manera rápida.

Un ejemplo, sería lo siguiente:

public class ServeiMP extends Service implements
MediaPlayer.OnPreparedListener {

 

private static final ACTION_PLAY = "com.example.action.PLAY";
MediaPlayer mMediaPlayer = null;
public int onStartCommand(Intent intent, int flags, int startId) {

...
if (intent.getAction().equals(ACTION_PLAY)) {
mMediaPlayer = ... //
inicialización
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.prepareAsync(); }

 

}

/** se llama cuando MediaPlayer está listo */

public void onPrepared(MediaPlayer player) {

player.start();

}

}

Será fundamental también gestionar los errores que se puedan producir de forma asíncrona para que la aplicación no se quede colgada. Por último, destacar que cuando se diseñan aplicaciones que reproducen medios en segundo plano, el dispositivo puede entrar en modo "dormido". Para evitarlo hay que utilizar "wake locks". Por ejemplo, en este caso que muestro más abajo, sólo pasa a dormido, cuando se hace una pausa o se para la reproducción de MediaPlayer.

En este caso solo la CPU se mantiene despierta, no otros servicios, como la conexión Wifi.

mMediaPlayer = new MediaPlayer();
...
mMediaPlayer.setWakeMode(getApplicationContext(),
PowerManager.PARTIAL_WAKE_LOCK);
//
solo en el caso que sea streaming
WifiLock wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE))
.createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");
wifiLock.acquire();
//
cuando haya una pausa o se pare
wifiLock.release();

Quizás el post de hoy ha sido un poco técnico y si no se tiene alguna experiencia programando en Android, sea complicado de seguir. El mensaje es que disponemos de librerías ya integradas para la gestión de recursos multimedia cuando queremos hacer desarrollos sobre el framework de Android.

Te animo a profundizar en la programación en Android y podrás ver el juego que te puede dar.

Curso relacionado: FP de Técnico Superior en Desarrollo Aplicaciones Multiplataforma

Desarrollo de aplicaciones multiplataforma: las librerías multimedia integradas
Carlos Yañez

Biografías: Ingeniero Superior de Telecomunicaciones por la UPC. Director de Informática en un Laboratorio de Análisis con implantación nacional. Profesor de los cursos de Electrónica y Técnico en Sistemas Microinformaticos y Redes.