Reproducir archivos de audio en nuestras aplicaciones android.
Necesitamos
Paso 1. Proyecto
Crea un proyecto nuevo android en Eclipse llamado «JMPlayer»
En la carpeta «RES», crea una nueva carpeta llamada «RAW» y pega el archivo MP3 dentro de ella, como se ve en la imagen siguiente:
Paso 2: Interfaz
Abre el archivo activity_main.xml y pega el siguiente código:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/tvMsg" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/app_name" android:gravity="center" android:textSize="32sp" /> <Button android:id="@+id/btnPlay" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/str_play" /> <Button android:id="@+id/btnPause" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/str_pause" /> <Button android:id="@+id/btnStop" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/str_stop" /> <TextView android:id="@+id/tvTime" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/app_name" android:textSize="18sp" /> <SeekBar android:id="@+id/skSong" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
También debes crear los siguientes string en la carpeta «RES/VALUES/»
<string name="str_play">PLAY</string> <string name="str_pause">PAUSE</string> <string name="str_stop">STOP</string>
Nuestra interfaz se debe ver como la siguiente imagen:
Paso 3. Código
Para reproducir archivos MP3 haremos uso de la clase MediaPlayer que también nos permite reproducir vídeos. La clase completa del MainActivity es:
package com.bolivia.jmplayer; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.SeekBar; import android.widget.TextView; public class MainActivity extends Activity{ private TextView tvMsg; private Button btnPlay; private Button btnPause; private Button btnStop; private SeekBar skSong; private TextView tvTime; private MediaPlayer mPlayer = null; private Handler skHandler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //-- begin mPlayer = MediaPlayer.create(MainActivity.this, R.raw.onnanokootokonoko); tvMsg = (TextView) findViewById(R.id.tvMsg); btnPlay = (Button) findViewById(R.id.btnPlay); btnPause = (Button) findViewById(R.id.btnPause); btnStop = (Button) findViewById(R.id.btnStop); skSong = (SeekBar) findViewById(R.id.skSong); tvTime = (TextView) findViewById(R.id.tvTime); //----------- button PLAY btnPlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(!mPlayer.isPlaying()) { mPlayer.start(); tvMsg.setText("PLAY"); } } }); //----------- button PAUSE btnPause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(mPlayer.isPlaying()) { mPlayer.pause(); tvMsg.setText("PAUSE"); } } }); //----------- button STOP btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mPlayer != null) { mPlayer.stop(); mPlayer.release(); mPlayer = MediaPlayer.create(MainActivity.this, R.raw.onnanokootokonoko); tvMsg.setText(":)"); } } }); //--- Se coloca el tiempo de duracion y se inicia el seek bar tvTime.setText( getHRM(mPlayer.getDuration()) ); skSong.setMax(mPlayer.getDuration()); skSong.setProgress(mPlayer.getCurrentPosition()); //cada segundo se actualiza el estado del seek bar skHandler.postDelayed(updateskSong, 1000); //-- end }//end:onCreate //se hace uso de un hilo para actualizar el progreso de la reproducción Runnable updateskSong = new Runnable() { @Override public void run() { skSong.setProgress( mPlayer.getCurrentPosition() ); tvTime.setText( getHRM(mPlayer.getDuration()) + " - " + getHRM(mPlayer.getCurrentPosition()) ); skHandler.postDelayed(updateskSong, 1000); } }; /** * Método que convierte milisegundos a Hora:Minuto:Segundo * @param int milliseconds * @return String HH:MM:SS * */ private String getHRM(int milliseconds ) { int seconds = (int) (milliseconds / 1000) % 60 ; int minutes = (int) ((milliseconds / (1000*60)) % 60); int hours = (int) ((milliseconds / (1000*60*60)) % 24); return ((hours<10)?"0"+hours:hours) + ":" + ((minutes<10)?"0"+minutes:minutes) + ":" + ((seconds<10)?"0"+seconds:seconds); } /** * Cuando la actividad ya no es visible por el usuario, * se detiene el reproductor * */ @Override protected void onStop() { super.onStop(); if (mPlayer != null) { mPlayer.stop(); mPlayer.release(); mPlayer = MediaPlayer.create(MainActivity.this, R.raw.onnanokootokonoko); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
Ejecuta para probar la aplicación:
Proyecto completo AQUI (12/01/2026)
BorderPane es un layout que distribuye los nodos hijos en 5 posiciones TOP, LEFT, BOTTOM, RIGHT y CENTER Los nodos hijos[...]
El patrón de desbloqueo es una medida de seguridad que tienen algunos teléfonos inteligentes para evitar el acceso al di[...]
En este post, crearemos una tabla swing que implemente un control jcombobox en una columna de una tabla, llenaremos con[...]
¿Qué es una transición? Una transición es un efecto de movimiento que se da entre una imagen y la siguiente en una prese[...]
En esta oportunidad, se deja a disposición de la comunidad de programadores de Bolivia y también porque no, del que quie[...]
En un post anterior se vio como llenar un JTree en donde se conocía de antemano que estructura iba a tener esta sin emba[...]