Skip to content

Instantly share code, notes, and snippets.

@toantran-ea
Forked from chathudan/RecordingActivity.java
Created January 31, 2018 09:27
Show Gist options
  • Save toantran-ea/64ee6bd67ed5a49c1e7bfe9bd5ea2433 to your computer and use it in GitHub Desktop.
Save toantran-ea/64ee6bd67ed5a49c1e7bfe9bd5ea2433 to your computer and use it in GitHub Desktop.
Android Audio recording, MediaRecorder example
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/grey50">
<LinearLayout
android:id="@+id/button_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/timer"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<Button
android:id="@+id/cancel_button"
style="?android:attr/borderlessButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/cancel"
android:textColor="@color/black87" />
<View
android:layout_width="1dp"
android:layout_height="fill_parent"
android:layout_marginBottom="7dp"
android:layout_marginTop="7dp"
android:background="@color/black12" />
<Button
android:id="@+id/share_button"
style="?android:attr/borderlessButtonStyle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/share"
android:textColor="@color/black87" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50sp"
android:text="0:00.0"
android:textColor="@color/red3000"
android:typeface="monospace"
android:textStyle="bold"
android:id="@+id/timer"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
/**
* @author Chathura Wijesinghe <[email protected]> on 9/9/15.
*/
public class RecordingActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mTimerTextView;
private Button mCancelButton;
private Button mStopButton;
private MediaRecorder mRecorder;
private long mStartTime = 0;
private int[] amplitudes = new int[100];
private int i = 0;
private Handler mHandler = new Handler();
private Runnable mTickExecutor = new Runnable() {
@Override
public void run() {
tick();
mHandler.postDelayed(mTickExecutor,100);
}
};
private File mOutputFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recording);
this.mTimerTextView = (TextView) this.findViewById(R.id.timer);
this.mCancelButton = (Button) this.findViewById(R.id.cancel_button);
this.mCancelButton.setOnClickListener(this);
this.mStopButton = (Button) this.findViewById(R.id.share_button);
this.mStopButton.setOnClickListener(this);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@Override
protected void onStart() {
super.onStart();
Log.d("Voice Recorder", "output: " + getOutputFile());
startRecording();
}
@Override
protected void onStop() {
super.onStop();
if (mRecorder != null) {
stopRecording(false);
}
}
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
mRecorder.setAudioEncodingBitRate(48000);
} else {
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mRecorder.setAudioEncodingBitRate(64000);
}
mRecorder.setAudioSamplingRate(16000);
mOutputFile = getOutputFile();
mOutputFile.getParentFile().mkdirs();
mRecorder.setOutputFile(mOutputFile.getAbsolutePath());
try {
mRecorder.prepare();
mRecorder.start();
mStartTime = SystemClock.elapsedRealtime();
mHandler.postDelayed(mTickExecutor, 100);
Log.d("Voice Recorder","started recording to "+mOutputFile.getAbsolutePath());
} catch (IOException e) {
Log.e("Voice Recorder", "prepare() failed "+e.getMessage());
}
}
protected void stopRecording(boolean saveFile) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
mStartTime = 0;
mHandler.removeCallbacks(mTickExecutor);
if (!saveFile && mOutputFile != null) {
mOutputFile.delete();
}
}
private File getOutputFile() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.US);
return new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString()
+ "/Voice Recorder/RECORDING_"
+ dateFormat.format(new Date())
+ ".m4a");
}
private void tick() {
long time = (mStartTime < 0) ? 0 : (SystemClock.elapsedRealtime() - mStartTime);
int minutes = (int) (time / 60000);
int seconds = (int) (time / 1000) % 60;
int milliseconds = (int) (time / 100) % 10;
mTimerTextView.setText(minutes+":"+(seconds < 10 ? "0"+seconds : seconds)+"."+milliseconds);
if (mRecorder != null) {
amplitudes[i] = mRecorder.getMaxAmplitude();
//Log.d("Voice Recorder","amplitude: "+(amplitudes[i] * 100 / 32767));
if (i >= amplitudes.length -1) {
i = 0;
} else {
++i;
}
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.cancel_button:
stopRecording(false);
setResult(RESULT_CANCELED);
finish();
break;
case R.id.share_button:
stopRecording(true);
Uri uri = Uri.parse("file://" + mOutputFile.getAbsolutePath());
Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
scanIntent.setData(uri);
sendBroadcast(scanIntent);
setResult(Activity.RESULT_OK, new Intent().setData(uri));
finish();
break;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment