Android Open Source - AudioRecorderAndroid Recorder






From Project

Back to project page AudioRecorderAndroid.

License

The source code is released under:

MIT License

If you think the Android project AudioRecorderAndroid listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.aemreunal.audiorecorder.model;
/*from  ww w.  j  a  v  a  2s .c o  m*/
/*
 * This code belongs to:
 * Ahmet Emre Unal
 */

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

public class Recorder {
    public static final int AUDIO_SOURCE = MediaRecorder.AudioSource.MIC;
    public static final int AUDIO_ENCODER = MediaRecorder.AudioEncoder.AAC;
    public static final int OUTPUT_FORMAT = MediaRecorder.OutputFormat.MPEG_4;
    public static final int AUDIO_ENCODING_BIT_RATE = 128000;
    public static final int AUDIO_SAMPLING_RATE = 44100;
    public static final int FPS = 60;
    public static final int TIMER_UPDATE_FREQUENCY_MS = 1000 / FPS;

    private String name;
    private long durationInMS;

    private MediaRecorder mediaRecorder;
    private String outputFilePath;
    private File outputFile;
    private MediaPlayer mediaPlayer;

    private Timer timer;
    private long elapsedTime;

    private boolean isRecording = false;
    private boolean isPlaying = false;

    private Activity parentActivity; // Must implement RecorderController interface

    public Recorder(Activity parentActivity, String name, long durationInMS) {
        if (!RecorderController.class.isAssignableFrom(parentActivity.getClass())) {
            throw new IllegalArgumentException("Parent activity hasn't implemented RecorderController interface!");
        }
        this.parentActivity = parentActivity;
        this.name = name;
        this.durationInMS = durationInMS;
        if (durationInMS < 1) {
            throw new IllegalArgumentException("Invalid recording duration argument provided!");
        }
        this.mediaRecorder = new MediaRecorder();
        this.mediaPlayer = new MediaPlayer();
    }

    public void startRecording() {
        initMediaRecorder();
        try {
            mediaRecorder.prepare();
            mediaRecorder.start();
            isRecording = true;
            createTimer();
        } catch (IllegalStateException e) {
            System.err.println("Unable to prepare mediaRecorder! IllegalState Exception");
            System.err.println(e.getMessage());
        } catch (IOException e) {
            System.err.println("Unable to prepare mediaRecorder! IO Exception");
            System.err.println(e.getMessage());
        }
    }

    public void stopRecording() {
        if (timer != null) {
            timer.cancel();
        }
        if (isRecording) {
            mediaRecorder.stop();
            mediaRecorder.reset();
            outputFile.delete();
            isRecording = false;
        }
    }

    public void startPlaying() {
        initMediaPlayer();
        try {
            mediaPlayer.prepare();
            mediaPlayer.start();
            isPlaying = true;
        } catch (IllegalStateException e) {
            showError(e);
        } catch (IOException e) {
            showError(e);
        }
    }

    public void stopPlaying() {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
        }
        mediaPlayer.reset();
    }

    public void stop() {
        stopPlaying();
        stopRecording();
        if (outputFile != null && outputFile.exists()) {
            outputFile.delete();
        }
    }

    private void onRecordingFinished() {
        isRecording = false;
        stopRecording();
        destroyMediaRecorder();
        initMediaPlayer();
        ((RecorderController) parentActivity).onRecordingFinished(outputFilePath);
    }

    private void onPlayingFinished() {
        isPlaying = false;
        stopPlaying();
        ((RecorderController) parentActivity).onPlayingFinished();
    }

    private void initMediaRecorder() {
        createOutputFile();
        setRecorderSettings();
    }

    private void createOutputFile() {
        outputFilePath = RecorderFileNameHelper.getOutputFilePath(name);
        outputFile = new File(outputFilePath);
        if (outputFile.exists()) {
            System.out.println("Output file exists, deleting it.");
            outputFile.delete();
        }
    }

    private void setRecorderSettings() {
        mediaRecorder.setAudioSource(AUDIO_SOURCE);
        mediaRecorder.setOutputFormat(OUTPUT_FORMAT);
        mediaRecorder.setAudioEncoder(AUDIO_ENCODER);
        mediaRecorder.setAudioEncodingBitRate(AUDIO_ENCODING_BIT_RATE);
        mediaRecorder.setAudioSamplingRate(AUDIO_SAMPLING_RATE);
        mediaRecorder.setOutputFile(outputFilePath);
        mediaRecorder.setMaxDuration((int) durationInMS);
        mediaRecorder.setOnInfoListener(new RecorderInfoListener());
    }

    private void createTimer() {
        elapsedTime = 0;
        timer = new Timer();
        timer.scheduleAtFixedRate(new UpdateTimerDisplayTask(), TIMER_UPDATE_FREQUENCY_MS, TIMER_UPDATE_FREQUENCY_MS);
    }

    private void initMediaPlayer() {
        mediaPlayer.setOnCompletionListener(new PlayerInfoListener());
        try {
            mediaPlayer.setDataSource(outputFilePath);
        } catch (IOException e) {
            showError(e);
        }
    }

    private void destroyMediaRecorder() {
        mediaRecorder.stop();
        mediaRecorder.reset();
        mediaRecorder.release();
        mediaRecorder = null;
    }

    private void showError(Exception e) {
        System.err.println("Unable to prepare MediaPlayer! An exception occurred.");
        System.err.println(e.getMessage());
        e.printStackTrace();
        Toast.makeText(parentActivity, "Unable to play recording, an exception occurred.", Toast.LENGTH_LONG).show();
    }

    public boolean isRecording() {
        return isRecording;
    }

    public boolean isPlaying() {
        return isPlaying;
    }

    private class RecorderInfoListener implements MediaRecorder.OnInfoListener {
        @Override
        public void onInfo(MediaRecorder mr, int what, int extra) {
            if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {
                onRecordingFinished();
            }
        }
    }

    private class UpdateTimerDisplayTask extends TimerTask {
        @Override
        public void run() {
            elapsedTime += TIMER_UPDATE_FREQUENCY_MS;
            ((RecorderController) parentActivity).updateTimerDisplay(durationInMS - elapsedTime);
            if (elapsedTime >= durationInMS) {
                timer.cancel();
            }
        }
    }

    private class PlayerInfoListener implements MediaPlayer.OnCompletionListener {
        @Override
        public void onCompletion(MediaPlayer mp) {
            onPlayingFinished();
        }
    }
}




Java Source Code List

com.aemreunal.audiorecorder.ApplicationTest.java
com.aemreunal.audiorecorder.RootActivity.java
com.aemreunal.audiorecorder.model.RecorderActivityController.java
com.aemreunal.audiorecorder.model.RecorderController.java
com.aemreunal.audiorecorder.model.RecorderFileNameHelper.java
com.aemreunal.audiorecorder.model.Recorder.java
com.aemreunal.audiorecorder.view.ProgressWheel.java
com.aemreunal.audiorecorder.view.RecorderActivity.java