Grabación y almacenamiento de audio en Android

Estoy desarrollando una aplicación de android (2.2) para grabar audio. El código parece funcionar bien e incluso guarda los archivos en la tarjeta SD, pero cuando intento reproducir los archivos de audio en mi Mac no pasa nada. Casi como si los archivos estuvieran vacíos. He intentado guardarlos como .mp3 y .wav, pero no hay suerte. Mi código está abajo:

import java.io.File; import java.io.IOException; import android.media.MediaRecorder; import android.os.Environment; public class AudioRecorder { private MediaRecorder recorder = new MediaRecorder(); private File outfile = null; public AudioRecorder(){} public void startRecording(String audioFile) throws IOException { String state = android.os.Environment.getExternalStorageState(); if(!state.equals(android.os.Environment.MEDIA_MOUNTED)) { throw new IOException("SD Card is not mounted. It is " + state + "."); } // make sure the directory we plan to store the recording in exists File directory = new File(path).getParentFile(); if (!directory.exists() && !directory.mkdirs()) { throw new IOException("Path to file could not be created."); } try{ File storageDir = new File(Environment .getExternalStorageDirectory(), "/audio/"); storageDir.mkdir(); outfile=File.createTempFile(audioFile, ".wav",storageDir); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(outfile.getAbsolutePath()); }catch(IOException e){ e.printStackTrace(); } try{ recorder.prepare(); }catch(IllegalStateException e){ e.printStackTrace(); } recorder.start(); } public void stop() throws IOException { recorder.stop(); recorder.release(); } } 

Mi actividad:

 /** * Recording Activity */ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import com.seekika.android.app.helpers.AudioRecorder; import android.app.Activity; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.os.SystemClock; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.Chronometer; public class Record extends Activity { private static final String TAG="RecordActivity"; private int SETTINGS=Menu.FIRST; private int LOGOUT=Menu.FIRST + 1; private int EXIT=Menu.FIRST + 2; //components private Button mBtnStartRecording; private Button mBtnStopRecording; private Chronometer mChronometer; private String audioFileName=""; final AudioRecorder recorder = new AudioRecorder(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.recordstory); initComponents(); } public void initComponents(){ mChronometer=(Chronometer)findViewById(R.id.chrono); mBtnStopRecording=(Button)findViewById(R.id.btn_stop_recording); mBtnStopRecording.setEnabled(false); mBtnStopRecording.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //stop timer stopRecording(); //stop recording and save audio file to SD card } }); mBtnStartRecording=(Button)findViewById(R.id.btn_start_recording); mBtnStartRecording.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startRecording(); mBtnStartRecording.setEnabled(false); mBtnStopRecording.setEnabled(true); //start recording audio //start timer } }); } private void startRecording(){ mChronometer.setBase(SystemClock.elapsedRealtime()); mChronometer.start(); try{ String myRecording="Seekika-" + System.currentTimeMillis(); Log.i(TAG, "Start Recording"); recorder.startRecording(myRecording); }catch(IOException e){ Log.e(TAG,"IOException error"); e.printStackTrace(); } } private void stopRecording(){ mChronometer.stop(); try{ recorder.stop(); }catch(IOException e){ e.printStackTrace(); } } } 

No sepa si puede usar esto, pero esto funciona para mí:

 public void recordAudio(String fileName) { final MediaRecorder recorder = new MediaRecorder(); ContentValues values = new ContentValues(3); values.put(MediaStore.MediaColumns.TITLE, fileName); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); recorder.setOutputFile("/sdcard/sound/" + fileName); try { recorder.prepare(); } catch (Exception e){ e.printStackTrace(); } final ProgressDialog mProgressDialog = new ProgressDialog(MyActivity.this); mProgressDialog.setTitle(R.string.lbl_recording); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); mProgressDialog.setButton("Stop recording", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { mProgressDialog.dismiss(); recorder.stop(); recorder.release(); } }); mProgressDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ public void onCancel(DialogInterface p1) { recorder.stop(); recorder.release(); } }); recorder.start(); mProgressDialog.show(); } 
  recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

Esto significa que desea crear (grabar) un archivo con OUTPUTFORMAT como RAW_AMR

Pero sólo proporcionando una ruta de acceso de archivo con un nombre de archivo como .mp3 , supongo que no lo haría. Y ese podría ser el problema.

Compruebe los detalles de los elementos de crear (prensa larga en el archivo y haga clic en detalles) que da cierta información sobre el archivo, como las propiedades de clic derecho de Windows.

  • Android: graba audio que se está reproduciendo desde el dispositivo a la toma de auriculares
  • El ID de registro de la aplicación no se genera en GCM Android
  • ¿Cómo puedo escribir salidas en el registro de Android?
  • Android desactivar "SignalStrength", etc para iniciar sesión LogCat
  • Android: aplicación con el informe de volcado de bloqueo
  • SLF4J varargs interpreta la primera cadena como marcador
  • ¿Por qué no debería usar System.out.println () en android
  • Logcat no muestra mis llamadas de registro
  • Imprimir el contenido de un paquete a Logcat?
  • Cómo deshabilitar los registros de las API externas en Android
  • GCM 'Error: No registrado'
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.