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>