Java: Grabar y reproducir sonido con Android

El código para una aplicación de ejemplo, un ejercicio que he hecho para aprender a usar las clases MediaRecorder y MediaPlayer y que se basa en grabar un sonido en la tarjeta SD y luego reproducirlo. La aplicación muestra dos botones, uno que alterna entre iniciar y finalizar la grabación y para reproducir el sonido, este estará desactivado al inicio y mientras esta grabando el sonido. Yo lo he hecho para la versión 15 de la API (Android 4.0) pero sólo por que me gusta más la interfaz, cambiando alguna linea del AndroidManifest.xml funcionará en versiones anteriores.

El código Java:

package u11.e1;

import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Main extends Activity {

   boolean grabando;
   MediaRecorder grabadora;
   MediaPlayer reproductor;

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

      grabando = false;

      final Button boton = (Button) findViewById(R.id.button1);
      final Button boton2 = (Button) findViewById(R.id.button2);

      boton.setOnClickListener(new OnClickListener(){
         @Override
         public void onClick(View v) {
            if(grabando){
               grabando = false;
               boton.setText("Sonido grabado, volver a grabarlo.");
               grabadora.stop();
               grabadora.release();
               boton2.setEnabled(true);
            }else{
               boton2.setEnabled(false);
               grabadora = new MediaRecorder();
            try {
               grabadora.reset();
               grabadora.setAudioSource(MediaRecorder.AudioSource.MIC);
               grabadora.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
               grabadora.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
               grabadora.setOutputFile("/sdcard/test.3gp");
               grabadora.prepare();
               grabadora.start();
               grabando = true;
               boton.setText("Finalizar");
            } catch (IllegalStateException e) {
               e.printStackTrace();
            } catch (IOException e) {
               e.printStackTrace();
            }
         }
      }
   }); 
   boton2.setOnClickListener(new OnClickListener(){
         @Override
         public void onClick(View v) {
            reproducirSonido("/sdcard/test.3gp");
         }
      }); 
   }

   private void reproducirSonido(String path){
      reproductor = new MediaPlayer();
      try {
         reproductor.setDataSource(path);
         reproductor.prepare();
         reproductor.start();
      } catch (IllegalArgumentException e) {
         e.printStackTrace();
      } catch (SecurityException e) {
         e.printStackTrace();
      } catch (IllegalStateException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

El layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="El archivo se guardará en /sdcard/test.3gp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Iniciar" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Reproducir sonido grabado"
        android:enabled="false" />

</LinearLayout>

Y el AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="u11.e1"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Light">
        <activity
            android:name=".Main"
            android:label="@string/app_name"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>



Josep Viciana

Programador de 27 años con una década de experiencia como programador. interesado en el diseño, ilustración y nuevas tecnologías. Dedicado desde siempre a la programación Web y desde hace algunos años también a la móvil.

No hay comentarios


Puedes dejar el primero : )



Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *