package com.talk.demo.audio; import android.app.Activity; import android.content.Intent; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.TextView; import com.talk.demo.R; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class AudioRecorderActivity extends Activity { private static final String LOG_TAG = "AudioRecorderActivity"; private String mFileName = null; private TextView timeView = null; private MediaRecorder mRecorder = null; private ImageButton mRecorderBtn = null; private MediaPlayer mPlayer = null; private ImageButton mPlayerBtn = null; private boolean mStartRecording = true; private boolean mStartPlaying = true; // time at which latest record or play operation started private long mSampleStart = 0; // length of current sample private int mSampleLength = 0; private boolean isRecording = false; private String mTimerFormat; final Handler mHandler = new Handler(); Runnable mUpdateTimer = new Runnable() { public void run() { updateTimerView(); } }; private void onRecord(boolean start) { if (start) { startRecording(); } else { stopRecording(); } } private void onPlay(boolean start) { if (start) { startPlaying(); } else { stopPlaying(); } } private void startPlaying() { mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(mFileName); mPlayer.prepare(); mPlayer.start(); } catch (IOException e) { Log.e(LOG_TAG, "prepare() failed"); } } private void stopPlaying() { mPlayer.release(); mPlayer = null; } private void startRecording() { isRecording = true; mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setOutputFile(getTimeAsFileName()); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mRecorder.prepare(); } catch (IOException e) { Log.e(LOG_TAG, "prepare() failed"); } mRecorder.start(); mSampleStart = System.currentTimeMillis(); updateTimerView(); } private void stopRecording() { mRecorder.stop(); mRecorder.release(); mRecorder = null; isRecording = false; mSampleLength = (int)( (System.currentTimeMillis() - mSampleStart)/1000 ); updateTimerView(); } private void createDir(String fileName) { File direct = new File(Environment.getExternalStorageDirectory() + "/Demo"); if(!direct.exists()) { File fileDirectory = new File("/sdcard/Demo/"); fileDirectory.mkdirs(); } } private void saveFile(String fileName) { File file = new File(new File("/sdcard/Demo/"), fileName); if(file.exists()) file.delete(); try { FileOutputStream out = new FileOutputStream(file); out.flush(); out.close(); } catch(Exception e) { e.printStackTrace(); } } private String getTimeAsFileName() { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = new Date(); createDir(dateFormat.format(date)); String fileName = "/sdcard/Demo/"+ dateFormat.format(date); mFileName = fileName; return fileName; } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.activity_audio_recorder); timeView = (TextView)findViewById(R.id.recorder_time_tick); mRecorderBtn = (ImageButton)findViewById(R.id.recorder_btn); mPlayerBtn = (ImageButton)findViewById(R.id.player_btn); mRecorderBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { onRecord(mStartRecording); mStartRecording = !mStartRecording; } }); mPlayerBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { onPlay(mStartPlaying); mStartPlaying = !mStartPlaying; } }); mRecorder = new MediaRecorder(); mTimerFormat = getResources().getString(R.string.timer_format); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.confirm_actions, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.action_confirm: //save record audio file saveFile(mFileName); //pass result to previous activity Intent resultIntent = new Intent(); resultIntent.putExtra("audio_file_name", mFileName); setResult(RESULT_OK, resultIntent); finish(); return true; default: return super.onOptionsItemSelected(item); } } public int progress() { return (int) ((System.currentTimeMillis() - mSampleStart)/1000); } /** * Update the big MM:SS timer. If we are in playback, also update the * progress bar. */ private void updateTimerView() { long time = isRecording?progress():mSampleLength; String timeStr = String.format(mTimerFormat, time/60, time%60); timeView.setText(timeStr); if(isRecording) mHandler.postDelayed(mUpdateTimer, 1000); } @Override public void onPause() { super.onPause(); if (mRecorder != null) { mRecorder.release(); mRecorder = null; } if (mPlayer != null) { mPlayer.release(); mPlayer = null; } } }