Search code examples
androidaudioandroid-mediaplayeraudio-recordingandroid-audiorecord

Recording and Playing back audio not working


I'm making a simple test application that has four buttons, start recording, stop recording, play, and stop.

The problem is I'm not able to hear any recordings and I'm not even sure that the recordings are being saved.

Here is my activities code

public class MainActivity extends Activity {

    private MediaPlayer mediaPlayer;
    private MediaRecorder recorder;
    private String OUTPUT_FILE;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        OUTPUT_FILE = Environment.getExternalStorageDirectory()+"/audiorecorder.3gpp";
    }

    public void buttonTapped (View view){
        switch(view.getId()){

        case R.id.btn_start_recording:
            try{
                beginRecording();
            } catch (Exception e){
                e.printStackTrace();
            }

        case R.id.btn_stop_recording:
            try{
                stopRecording();
            } catch (Exception e){
                e.printStackTrace();
            }

        case R.id.btn_play:
            try{
                playRecording();
            } catch (Exception e){
                e.printStackTrace();
            }

        case R.id.btn_stop:
            try{
                stopPlayback();
            } catch (Exception e){
                e.printStackTrace();
            }       

        }
    }

    private void stopPlayback() {
        if(mediaPlayer != null)
            mediaPlayer.stop();
    }

    private void playRecording() throws Exception{
        ditchMediaPlayer();
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setDataSource(OUTPUT_FILE);
        mediaPlayer.prepare();
        mediaPlayer.start();
    }

    private void ditchMediaPlayer() {
        if(mediaPlayer != null){
            try{
                mediaPlayer.release();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

    private void stopRecording() {
        if(recorder != null)
            recorder.stop();
    }

    private void beginRecording() throws Exception {
        ditchMediaRecorder();
        File outFile = new File(OUTPUT_FILE);

        if(outFile.exists())
            outFile.delete();

        recorder = new MediaRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        recorder.setAudioEncoder(MediaRecorder.getAudioSourceMax());
        recorder.setAudioEncodingBitRate(16);
        recorder.setAudioSamplingRate(44100);
        recorder.setOutputFile(OUTPUT_FILE);
        recorder.prepare();
        recorder.start(); 
    }

    private void ditchMediaRecorder() {
        //if we have the recorder, release it
        if(recorder != null)
            recorder.release();
    }

}

The type of errors I'm getting

04-13 15:07:56.618: W/System.err(2542): java.io.IOException: Prepare failed.: status=0x1
04-13 15:07:56.618: W/System.err(2542):     at android.media.MediaPlayer.prepare(Native Method)
04-13 15:07:56.618: W/System.err(2542):     at com.appulse.audiomate.MainActivity.playRecording(MainActivity.java:70)
04-13 15:07:56.628: W/System.err(2542):     at com.appulse.audiomate.MainActivity.buttonTapped(MainActivity.java:46)
04-13 15:07:56.628: W/System.err(2542):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 15:07:56.628: W/System.err(2542):     at java.lang.reflect.Method.invoke(Method.java:515)
04-13 15:07:56.628: W/System.err(2542):     at android.view.View$1.onClick(View.java:3818)
04-13 15:07:56.628: W/System.err(2542):     at android.view.View.performClick(View.java:4438)
04-13 15:07:56.628: W/System.err(2542):     at android.view.View$PerformClick.run(View.java:18422)
04-13 15:07:56.628: W/System.err(2542):     at android.os.Handler.handleCallback(Handler.java:733)
04-13 15:07:56.628: W/System.err(2542):     at android.os.Handler.dispatchMessage(Handler.java:95)
04-13 15:07:56.628: W/System.err(2542):     at android.os.Looper.loop(Looper.java:136)
04-13 15:07:56.628: W/System.err(2542):     at android.app.ActivityThread.main(ActivityThread.java:5017)
04-13 15:07:56.628: W/System.err(2542):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 15:07:56.628: W/System.err(2542):     at java.lang.reflect.Method.invoke(Method.java:515)
04-13 15:07:56.628: W/System.err(2542):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-13 15:07:56.628: W/System.err(2542):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-13 15:07:56.628: W/System.err(2542):     at dalvik.system.NativeStart.main(Native Method)
04-13 15:07:56.628: E/MediaPlayer(2542): stop called in state 0
04-13 15:07:56.628: E/MediaPlayer(2542): error (-38, 0)
04-13 15:07:56.628: E/MediaPlayer(2542): Error (-38,0)

Solution

  • You have missed out couple of things here, add break statement after each case in the function buttonTapped,

    public void buttonTapped (View view){
        switch(view.getId()){
    
        case R.id.btn_start_recording:
            try{
                beginRecording();
            } catch (Exception e){
                e.printStackTrace();
            }
            break;
    
        case R.id.btn_stop_recording:
            try{
                stopRecording();
            } catch (Exception e){
                e.printStackTrace();
            }
            break;
    
        case R.id.btn_play:
            try{
                playRecording();
            } catch (Exception e){
                e.printStackTrace();
            }
            break;
    
        case R.id.btn_stop:
            try{
                stopPlayback();
            } catch (Exception e){
                e.printStackTrace();
            } 
            break;
    
        }
    }
    

    and in the manifest files add these permissions.

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