«

»

oct 11 2011

Reproducir sonidos con MediaPlayer

Hoy vamos a abordar el ambito multimedia ya que nuestras aplicaciones ademas de funcionales deber de ser vistosas, este es un factor que se aun mas importante se se trata de videojuegos o aplicaciones de ocio y es por eso que en ésta ocasión os vamos a explicar una de las formas de reproducir sonidos en android.

sound

Para ello vamos a crear un nuevo proyecto con estas carácteristicas:

Nombre del Proyecto: Audio
Target: Android 2.2
Nombre de la aplicación: Audio
Nombre del paquete: com.test.audio
Crear Activity: Audio
Min SDK Version: 8

Ahora vamos a añadir nuestros sonidos al directorio res/raw de nuestro proyecto.

Sólo tenemos que arrastrar los archivos a la carpeta correspondiente de nuestro  proyecto o crearlo en el caso de que no exista.

Al hacer esto, el plugin de eclipse se encargará de generar automáticamente los símbolos java en la clase R.

Ahora nos vamos a editar la Actividad Audio  (src/org/example/audio/Audio.java).

 

package com.test.audio;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;

public class Audio extends Activity {
private MediaPlayer mp;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
}

 

Nótese que hemos añadido el método setVolumeControlStream(), el cual le dice a android que cuando el usuario presione el botón de subir/bajar el volumen, mientras esta aplicación esta activa, deberá ajustar el volumen multimedia en vez del volumen de llamada.

Lo siguiente será reconocer la tecla pulsada y reproducir correctamente los sonidos. Haremos esto sobrescribiendo el método ActivityonKeyDown().

 

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
int resId;

switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
resId = R.raw.up;
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
resId = R.raw.down;
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
resId = R.raw.left;
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
resId = R.raw.right;
break;
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_ENTER:
resId = R.raw.enter;
break;
case KeyEvent.KEYCODE_A:
resId = R.raw.a;
break;
case KeyEvent.KEYCODE_S:
resId = R.raw.s;
break;
case KeyEvent.KEYCODE_D:
resId = R.raw.d;
break;
case KeyEvent.KEYCODE_F:
resId = R.raw.f;
break;
default:
return super.onKeyDown(keyCode, event);
}

 

Por último crearemos dentro onKeyDown la condición para liberar los sonidos anteriormente cargados y creamos también el propio MediaPlayer.

 

//Liberar cualquier sonido de un Mediaplayer anterior
if (mp != null) {
mp.release();
}

// Crear un nuevo MediaPlayer para reproducir este sonido
mp = MediaPlayer.create(this, resId);
mp.start();

// indicar cuando la tecla es pulsada
return true;
}

 

Si ahora ejecutamos el programa y presionamos una de las teclas deberíamos oír el sonido correspondiente a esa tecla.

Nota: Esta aplicación sólo reproduce un sonido a la vez, para soportar sonidos simultáneos deberíamos usar la clase SoundPool.

¿Qué formatos de audio son admitidos por Android?

Teóricamente, si nos vamos a la documentación, son soportados estos tipos de archivos:

• WAV (PCM sin compresión)
• AAC (Formato Apple e iPod , sin protección)
• MP3 (MPEG-3)
• WMA (Windows media audio)
• AMR (Speech codec)
• OGG (Ogg Vorbis)
• MIDI (Instrumentos)

Recordar que el emulador de android dificulta bastante el trabajar con sonidos, y sólo en un dispositivo real se puede apreciar el funcionamiento de nuestros sonidos.

Sin más, un saludo y ¡hasta la próxima!

Espero les haya servido de ayuda.

 

Acerca del autor

Breogangf

Desarrollador de Android, estudiante de Teleco, fundador @cogiloo, co-fundador @redinput , redactor @androcode.

  • http://molda.es molda

    Un post muy interesante.

    Muchas gracias.

  • Pingback: Reproducir sonidos en Android | | AndroideityAndroideity()

  • Ignacio

    Buenas, quería saber como al introducir los archivos de audio en la carpeta raw (la cuál tengo que crearme no?), me sale un error, diciendo que el fichero no se puede resolver o no es un campo. Es porque hay que ponerle el formato, o no porque hay que definir algo en el archivo R.java? Gracias.

    • http://www.redinput.com Breogangf | Redactor

      El archivo .R es generado automáticamente, crea referencias a todos los archivos de tu proyecto.
      Revisa si puede ser el nombre, la extensión o el formato. Un saludo.

  • http://tuklandestino.com alberto

    Hola, por lo que veo eres un crack con Android y por eso te pido una ayudita si te biene a bien concedérmela.
    Estoy liado con un juego en 2D, sólo para practicar, y ya lo tengo casi acabado pero me ha salido un problema de última hora.
    Resulta que quiero usar SoundPool en una clase aparte de manera que cada vez que instancie esa clase suene un sonido desde R.raw, algo así como:

    ……..bla,bla,código…..

    Sonido sn=new Sonido();
    sn.play();

    ……
    ….bla,bla,código

    y no consigo crear la clase que cargue y reproduzca el SoundPool.
    Me he ARTADO ( una semana) de ver y probar códigos pero no doy con la tecla.
    Agradezco tus consejos.
    Un saludo, Alberto Navarro.

  • kenneth

    estupendo post!!
    como puedo reproducir audios de la SD????
    gracias

  • Nuria

    Hola, me gustaría hacerte varias preguntas a cerca de android, estoy haciendo el proyecto fin de carrera y ando bastante agobiada, podrías darme tu dir de correo???

    Un saludo

  • Fran

    me gustaria saber si con mediaplayer se puede configurar el ratio, igual que se puede con el soundpool,
    para asi poder reproducir una cancion a mas velocidad.

    gracias, un saludo

  • Zulma

    Excelente ayuda, me sirvió mucho. Zulma

  • Christian

    Buenas, me gustaría saber como puedo reproducir dos sonidos de manera simultánea en Android , si es posible con un ejemplo , me estoy volviendo loco buscando cómo hacerlo.
    Gracias y un saludo!

  • jpier

    Como puedo hacer eso dando clic a un boton, agradeceria tu ayuda

  • jeyk

    quiero felicitarte por tu post esta muy interesante pero quisiera hacerte una pregunta como puedo hacer que un Reproductor creado por mi presente un listado de las canciones disponibles las que se encuentran en la tarjeta SD para poder seleccionarlas y reproducirlas muchas gracias de ante mano…