Back to project page continuous-audiorecorder.
The source code is released under:
Copyright (c) 2013, Nikolai Doronin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:...
If you think the Android project continuous-audiorecorder listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package com.github.lassana.recorder; //from w w w .j av a 2s . co m import android.annotation.SuppressLint; import android.content.Context; import android.media.MediaRecorder; import android.os.AsyncTask; import java.io.File; import java.io.IOException; /** * @author Nikolai Doronin {@literal <lassana.nd@gmail.com>} * @since 8/18/13 */ public class AudioRecorder { public static enum Status { STATUS_UNKNOWN, STATUS_READY_TO_RECORD, STATUS_RECORDING, STATUS_RECORD_PAUSED } public static interface OnException { public void onException(Exception e); } public static interface OnStartListener extends OnException { public void onStarted(); } public static interface OnPauseListener extends OnException { public void onPaused(String activeRecordFileName); } /** * @author lassana * @since 10/06/2013 */ public static class MediaRecorderConfig { private final int mAudioEncodingBitRate; private final int mAudioChannels; private final int mAudioSource; private final int mAudioEncoder; public static final MediaRecorderConfig DEFAULT = new MediaRecorderConfig(64 * 1024, /* 64 Kib per second */ 2, /* Stereo */ MediaRecorder.AudioSource.DEFAULT, /* Default audio source (usually, phone microphone) */ ApiHelper.DEFAULT_AUDIO_ENCODER); /* Default encoder for target Android version */ /** * Constructor. * * @param audioEncodingBitRate * Used for {@link android.media.MediaRecorder#setAudioEncodingBitRate} * @param audioChannels * Used for {@link android.media.MediaRecorder#setAudioChannels} * @param audioSource * Used for {@link android.media.MediaRecorder#setAudioSource} * @param audioEncoder * Used for {@link android.media.MediaRecorder#setAudioEncoder} */ public MediaRecorderConfig(int audioEncodingBitRate, int audioChannels, int audioSource, int audioEncoder) { mAudioEncodingBitRate = audioEncodingBitRate; mAudioChannels = audioChannels; mAudioSource = audioSource; mAudioEncoder = audioEncoder; } } class StartRecordTask extends AsyncTask<OnStartListener, Void, Exception> { private OnStartListener mOnStartListener; @Override protected Exception doInBackground(OnStartListener... params) { this.mOnStartListener = params[0]; mMediaRecorder = new MediaRecorder(); mMediaRecorder.setAudioEncodingBitRate(mMediaRecorderConfig.mAudioEncodingBitRate); mMediaRecorder.setAudioChannels(mMediaRecorderConfig.mAudioChannels); mMediaRecorder.setAudioSource(mMediaRecorderConfig.mAudioSource); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setOutputFile(getTemporaryFileName()); mMediaRecorder.setAudioEncoder(mMediaRecorderConfig.mAudioEncoder); Exception exception = null; try { mMediaRecorder.prepare(); mMediaRecorder.start(); } catch (IOException e) { exception = e; } return exception; } @Override protected void onPostExecute(Exception e) { super.onPostExecute(e); if (e == null) { setStatus(AudioRecorder.Status.STATUS_RECORDING); mOnStartListener.onStarted(); } else { setStatus(AudioRecorder.Status.STATUS_READY_TO_RECORD); mOnStartListener.onException(e); } } } class PauseRecordTask extends AsyncTask<OnPauseListener, Void, Exception> { private OnPauseListener mOnPauseListener; @Override protected Exception doInBackground(OnPauseListener... params) { mOnPauseListener = params[0]; Exception exception = null; try { mMediaRecorder.stop(); mMediaRecorder.release(); } catch (Exception e) { exception = e; } if ( exception == null ) { appendToFile(mTargetRecordFileName, getTemporaryFileName()); } return exception; } @Override protected void onPostExecute(Exception e) { super.onPostExecute(e); if (e == null) { setStatus(AudioRecorder.Status.STATUS_RECORD_PAUSED); mOnPauseListener.onPaused(mTargetRecordFileName); } else { setStatus(AudioRecorder.Status.STATUS_READY_TO_RECORD); mOnPauseListener.onException(e); } } } private Status mStatus; private MediaRecorder mMediaRecorder; private final String mTargetRecordFileName; private final Context mContext; private final MediaRecorderConfig mMediaRecorderConfig; private AudioRecorder(final Context context, final String targetRecordFileName, final MediaRecorderConfig mediaRecorderConfig) { mTargetRecordFileName = targetRecordFileName; mContext = context; mMediaRecorderConfig = mediaRecorderConfig; mStatus = Status.STATUS_UNKNOWN; } /** * Returns the ready-to-use AudioRecorder. * Uses {@link com.github.lassana.recorder.AudioRecorder.MediaRecorderConfig#DEFAULT} as * {@link android.media.MediaRecorder} config. */ public static AudioRecorder build(final Context context, final String targetFileName) { return build(context, targetFileName, MediaRecorderConfig.DEFAULT); } /** * Returns the ready-to-use AudioRecorder. */ public static AudioRecorder build(final Context context, final String targetFileName, final MediaRecorderConfig mediaRecorderConfig) { AudioRecorder rvalue = new AudioRecorder(context, targetFileName, mediaRecorderConfig); rvalue.mStatus = Status.STATUS_READY_TO_RECORD; return rvalue; } /** * Continues existing record or starts new one. */ @SuppressLint("NewApi") public void start(final OnStartListener listener) { StartRecordTask task = new StartRecordTask(); if (ApiHelper.HAS_EXECUTE_ON_EXECUTOR_METHOD) { task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, listener); } else { task.execute(listener); } } /** * Pauses active recording. */ @SuppressLint("NewApi") public void pause(final OnPauseListener listener) { PauseRecordTask task = new PauseRecordTask(); if (ApiHelper.HAS_EXECUTE_ON_EXECUTOR_METHOD) { task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, listener); } else { task.execute(listener); } } public Status getStatus() { return mStatus; } public String getRecordFileName() { return mTargetRecordFileName; } public boolean isRecording() { return mStatus == Status.STATUS_RECORDING; } public boolean isReady() { return mStatus == Status.STATUS_READY_TO_RECORD; } public boolean isPaused() { return mStatus == Status.STATUS_RECORD_PAUSED; } private void setStatus(final Status status) { mStatus = status; } private String getTemporaryFileName() { return mContext.getCacheDir().getAbsolutePath() + File.separator + "tmprecord"; } private void appendToFile(final String targetFileName, final String newFileName) { Mp4ParserWrapper.append(targetFileName, newFileName); } }