DesarrolloLibre

Desarrollo Web, Android y mucho más

20-03-2017

Como su nombre indica, los MediaPlayer son empleados para reproducir y controlar la reproducción de audios y/o videos en Android; aunque parezca complejo su uso son bastante sencillo y configurables, esta entrada no pretende ser una guía para emplear los MediaPlayer, en Android, ni tampoco crear un reproductor como haremos en posteriores entradas, la idea es ejemplificar su uso más básico y explicar el propósito de dos componente muy importantes que son el método prepare y prepareAsync que aunque sus nombre se parezca, el propósito de cada uno es distinto y el uso de uno o el otro pueden tener resultados muy distintos en nuestra aplicación.

Para reproducir un audio primero debemos crear un objeto de la clase MediaPlayer:

player = new MediaPlayer();

Ahora debemos de indicar la fuente de los datos, los cuales pueden ser internos, es decir localizados en el mismo dispositivo Android o en una web y la accedemos vía una URL como la siguiente:

player.setDataSource("http://example.net/uploads/fuente/"
         + cancion.getFuente());

Android se encarga de descargar el audio; una vez establecido el fuente preparamos el audio e iniciamos la reproducción:

player.prepare();
player.start();

Finalmente nuestro código queda de la siguiente forma:

try {
    player.setDataSource("http://example.net/uploads/fuente/"
            + cancion.getFuente());
    player.prepare();
    player.start();
} catch (Exception e) {
    e.printStackTrace();
}

Audios cargados de manera asíncrona

Dependiendo del propósito de su aplicación puede que te de algunos problemas el código mostrado anteriormente, la razón se basa en que los audios hasta que no estén completamente preparado prepare() para su reproducción la aplicación se nos puede "colgar" dependiendo en que hilo en donde invoquemos dicho método que generalmente es en hilo principal y es posible que aparezca la famosa ventana de "No responde":

No responde app android

En la cual nos indica que la aplicación no responde y si deseas cerrarla; cosa que no es positiva en la experiencia que tenga el usuario con nuestra aplicación.

prepareAsync para preparar el audio de manera asíncrona

El problema se hace mayor si por ejemplo todos los audios nos los traemos desde Internet y la aplicación consiste en un listado de audios, y si al usuario empieza a seleccionar varios de ellos el cuelgue de nuestra aplicación se hace inminente...

La solución es realmente sencilla y no tenemos que crear servicios o hilo y colocar todo el procesamiento dentro de los mismos ni nada por el estilo; simplemente tenemos que emplear el método prepareAsync y cambiar unas pequeñas cosas del código anterior y agregar otras.

Primero el método prepareAsync permite preparar al audio igual que el método prepare pero lo realiza de manera asíncrona, por lo tanto el audio deberá reproducirse (dependiendo de la acción que queramos hacer sobre el mismo) una vez que el audio esté listo o preparado; para eso empleamos un evento escuchador onPrepared y dentro del mismo movemos nuestro método play():

try {
    player.setDataSource("http://example.net/uploads/fuente/"
            + cancion.getFuente());
    player.setOnPreparedListener(this);
    player.prepareAsync();
} catch (Exception e) {
    e.printStackTrace();
}

Y definimos nuestro evento escuchador quedando de la siguiente forma:

@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    if (mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
    }
    mediaPlayer.start();
}

Y con esto adiós cuelgue (al menos los ocasionados por el método prepare); como vemos, con el método prepareAsync el cual no necesita ser definido en un hilo o proceso aparte y es Android el que se encarga del fuerte de manejar los procesos en segundo plano necesarios.


Publicidad

Give me for a beer!

Algunos recursos que te pueden interesar

Creando increibles Drawer en Android con MaterialDrawer

Creando increibles Drawer en Android con MaterialDrawer

Librería oficial de PayPal para Android

Librería oficial de PayPal  para Android

Paleta de colores para el Material Design

Paleta de colores para el Material Design

Algunos artículos que te pueden interesar

Construyendo nuestro propio logo Android con SVG en HTML

Construyendo nuestro propio logo Android con SVG en HTML

En esta entrada abordaremos un tema un poco más práctico y veremos cómo construir nuestro propio logo de Android empleando lo hablado hasta el momento.

Andrés Cruz 21-05-2015

Localización de la instalación de las aplicaciones en Android

Localización de la instalación de las aplicaciones en Android

A partir del API Nivel 8 (Android 2.2), es posible que nuestras aplicaciones puedan ser instaladas en una memoria externa (por ejemplo una memoria Micro SD).

Andrés Cruz 27-12-2013

Debugging de páginas web con Google Chrome y Android

Debugging de páginas web con Google Chrome y Android

Se explica cómo realizar el debugging de nuestras páginas web desde un dispositivo Android en nuestra PC.

Andrés Cruz 30-01-2017