Recorder.java revision c4deebf0a7650448a95986d675fccb7d8a3ceadb
145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectpackage com.android.soundrecorder; 245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport java.io.File; 445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport java.io.IOException; 545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 6615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Triviimport android.content.Context; 7615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Triviimport android.media.AudioManager; 845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.media.MediaPlayer; 945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.media.MediaRecorder; 1045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.media.MediaPlayer.OnCompletionListener; 1145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.media.MediaPlayer.OnErrorListener; 1245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.os.Bundle; 1345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.os.Environment; 1445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectimport android.util.Log; 1545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 1645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Projectpublic class Recorder implements OnCompletionListener, OnErrorListener { 1745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project static final String SAMPLE_PREFIX = "recording"; 1845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project static final String SAMPLE_PATH_KEY = "sample_path"; 1945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project static final String SAMPLE_LENGTH_KEY = "sample_length"; 2045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 2145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public static final int IDLE_STATE = 0; 2245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public static final int RECORDING_STATE = 1; 2345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public static final int PLAYING_STATE = 2; 2445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 2545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project int mState = IDLE_STATE; 2645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 2745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public static final int NO_ERROR = 0; 2845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public static final int SDCARD_ACCESS_ERROR = 1; 2945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public static final int INTERNAL_ERROR = 2; 30615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi public static final int IN_CALL_RECORD_ERROR = 3; 3145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 3245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public interface OnStateChangedListener { 3345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void onStateChanged(int state); 3445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void onError(int error); 3545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 3645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project OnStateChangedListener mOnStateChangedListener = null; 3745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 3845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project long mSampleStart = 0; // time at which latest record or play operation started 3945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project int mSampleLength = 0; // length of current sample 4045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project File mSampleFile = null; 4145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 4245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project MediaRecorder mRecorder = null; 4345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project MediaPlayer mPlayer = null; 4445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 4545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public Recorder() { 4645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 4745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 4845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void saveState(Bundle recorderState) { 4945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project recorderState.putString(SAMPLE_PATH_KEY, mSampleFile.getAbsolutePath()); 5045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project recorderState.putInt(SAMPLE_LENGTH_KEY, mSampleLength); 5145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 5245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 5345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public int getMaxAmplitude() { 5445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (mState != RECORDING_STATE) 5545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return 0; 5645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return mRecorder.getMaxAmplitude(); 5745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 5845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 5945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void restoreState(Bundle recorderState) { 6045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project String samplePath = recorderState.getString(SAMPLE_PATH_KEY); 6145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (samplePath == null) 6245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 6345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project int sampleLength = recorderState.getInt(SAMPLE_LENGTH_KEY, -1); 6445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (sampleLength == -1) 6545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 6645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 6745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project File file = new File(samplePath); 6845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (!file.exists()) 6945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 7045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (mSampleFile != null 7145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project && mSampleFile.getAbsolutePath().compareTo(file.getAbsolutePath()) == 0) 7245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 7345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 7445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project delete(); 7545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mSampleFile = file; 7645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mSampleLength = sampleLength; 7745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 7845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project signalStateChanged(IDLE_STATE); 7945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 8045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 8145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void setOnStateChangedListener(OnStateChangedListener listener) { 8245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mOnStateChangedListener = listener; 8345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 8445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 8545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public int state() { 8645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return mState; 8745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 8845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 8945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public int progress() { 9045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (mState == RECORDING_STATE || mState == PLAYING_STATE) 9145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return (int) ((System.currentTimeMillis() - mSampleStart)/1000); 9245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return 0; 9345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 9445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 9545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public int sampleLength() { 9645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return mSampleLength; 9745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 9845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 9945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public File sampleFile() { 10045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return mSampleFile; 10145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 10245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 10345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project /** 10445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project * Resets the recorder state. If a sample was recorded, the file is deleted. 10545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project */ 10645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void delete() { 10745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project stop(); 10845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 10945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (mSampleFile != null) 11045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mSampleFile.delete(); 11145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 11245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mSampleFile = null; 11345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mSampleLength = 0; 11445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 11545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project signalStateChanged(IDLE_STATE); 11645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 11745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 11845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project /** 11945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project * Resets the recorder state. If a sample was recorded, the file is left on disk and will 12045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project * be reused for a new recording. 12145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project */ 12245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void clear() { 12345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project stop(); 12445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 12545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mSampleLength = 0; 12645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 12745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project signalStateChanged(IDLE_STATE); 12845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 12945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 130615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi public void startRecording(int outputfileformat, String extension, Context context) { 13145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project stop(); 13245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 13345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (mSampleFile == null) { 13445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project File sampleDir = Environment.getExternalStorageDirectory(); 13545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (!sampleDir.canWrite()) // Workaround for broken sdcard support on the device. 13645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project sampleDir = new File("/sdcard/sdcard"); 13745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 13845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project try { 13945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mSampleFile = File.createTempFile(SAMPLE_PREFIX, extension, sampleDir); 14045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } catch (IOException e) { 14145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project setError(SDCARD_ACCESS_ERROR); 14245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 14345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 14445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 14545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 14645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder = new MediaRecorder(); 14745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 14845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder.setOutputFormat(outputfileformat); 14945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 15045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder.setOutputFile(mSampleFile.getAbsolutePath()); 15145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 15245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project // Handle IOException 15345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project try { 15445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder.prepare(); 15545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } catch(IOException exception) { 15645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project setError(INTERNAL_ERROR); 15745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder.reset(); 15845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder.release(); 15945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder = null; 16045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 16145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 162615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi // Handle RuntimeException if the recording couldn't start 163615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi try { 164615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi mRecorder.start(); 165615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi } catch (RuntimeException exception) { 166615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi AudioManager audioMngr = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 167c4deebf0a7650448a95986d675fccb7d8a3ceadbJean-Michel Trivi boolean isInCall = ((audioMngr.getMode() == AudioManager.MODE_IN_CALL) || 168c4deebf0a7650448a95986d675fccb7d8a3ceadbJean-Michel Trivi (audioMngr.getMode() == AudioManager.MODE_IN_COMMUNICATION)); 169615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi if (isInCall) { 170615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi setError(IN_CALL_RECORD_ERROR); 171615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi } else { 172615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi setError(INTERNAL_ERROR); 173615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi } 174615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi mRecorder.reset(); 175615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi mRecorder.release(); 176615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi mRecorder = null; 177615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi return; 178615384c62e2906613590e6f33a37f7dfe4276a59Jean-Michel Trivi } 17945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mSampleStart = System.currentTimeMillis(); 18045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project setState(RECORDING_STATE); 18145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 18245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 18345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void stopRecording() { 18445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (mRecorder == null) 18545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 18645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 18745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder.stop(); 18845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder.release(); 18945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mRecorder = null; 19045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 19145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mSampleLength = (int)( (System.currentTimeMillis() - mSampleStart)/1000 ); 19245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project setState(IDLE_STATE); 19345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 19445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 19545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void startPlayback() { 19645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project stop(); 19745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 19845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer = new MediaPlayer(); 19945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project try { 20045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer.setDataSource(mSampleFile.getAbsolutePath()); 20145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer.setOnCompletionListener(this); 20245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer.setOnErrorListener(this); 20345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer.prepare(); 20445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer.start(); 20545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } catch (IllegalArgumentException e) { 20645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project setError(INTERNAL_ERROR); 20745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer = null; 20845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 20945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } catch (IOException e) { 21045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project setError(SDCARD_ACCESS_ERROR); 21145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer = null; 21245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 21345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 21445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 21545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mSampleStart = System.currentTimeMillis(); 21645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project setState(PLAYING_STATE); 21745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 21845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 21945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void stopPlayback() { 22045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (mPlayer == null) // we were not in playback 22145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 22245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 22345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer.stop(); 22445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer.release(); 22545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mPlayer = null; 22645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project setState(IDLE_STATE); 22745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 22845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 22945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void stop() { 23045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project stopRecording(); 23145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project stopPlayback(); 23245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 23345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 23445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public boolean onError(MediaPlayer mp, int what, int extra) { 23545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project stop(); 23645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project setError(SDCARD_ACCESS_ERROR); 23745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return true; 23845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 23945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 24045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project public void onCompletion(MediaPlayer mp) { 24145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project stop(); 24245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 24345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 24445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project private void setState(int state) { 24545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (state == mState) 24645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project return; 24745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 24845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mState = state; 24945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project signalStateChanged(mState); 25045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 25145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 25245fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project private void signalStateChanged(int state) { 25345fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (mOnStateChangedListener != null) 25445fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mOnStateChangedListener.onStateChanged(state); 25545fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 25645fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project 25745fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project private void setError(int error) { 25845fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project if (mOnStateChangedListener != null) 25945fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project mOnStateChangedListener.onError(error); 26045fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project } 26145fd319136b87911aae50269618b51c4a5902ad9The Android Open Source Project} 262