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>

Comentarios (2)

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.