package com.record.util; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.os.Environment; import android.text.format.Time; import android.util.Log; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; public class RecordWavMaster { private static final int samplingRates[] = {16000, 11025, 11000, 8000, 6000}; public static int SAMPLE_RATE = 16000; private AudioRecord mRecorder; private File mRecording; private short[] mBuffer; private String audioFilePath; private boolean mIsRecording = false; private String RECORD_WAV_PATH = Environment.getExternalStorageDirectory() + File.separator + "AudioRecord"; public RecordWavMaster() { initRecorder(); } public static int getValidSampleRates() { for (int rate : samplingRates) { int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT); if (bufferSize > 0) { return rate; } } return SAMPLE_RATE; } public void recordWavStart() { mIsRecording = true; mRecorder.startRecording(); mRecording = getFile("raw"); startBufferedWrite(mRecording); } public String recordWavStop() { try { mIsRecording = false; mRecorder.stop(); File waveFile = getFile("wav"); rawToWave(mRecording, waveFile); Log.e("path_audioFilePath",audioFilePath); return audioFilePath; } catch (Exception e) { Log.e("Error saving file : ", e.getMessage()); } return null; } public void releaseRecord() { mRecorder.release(); } private void initRecorder() { SAMPLE_RATE = getValidSampleRates(); int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); mBuffer = new short[bufferSize]; mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); new File(RECORD_WAV_PATH).mkdir(); } private void startBufferedWrite(final File file) { new Thread(new Runnable() { @Override public void run() { DataOutputStream output = null; try { output = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file))); while (mIsRecording) { double sum = 0; int readSize = mRecorder.read(mBuffer, 0, mBuffer.length); for (int i = 0; i < readSize; i++) { output.writeShort(mBuffer[i]); sum += mBuffer[i] * mBuffer[i]; } if (readSize > 0) { final double amplitude = sum / readSize; } } } catch (IOException e) { Log.e("Error writing file : ", e.getMessage()); } finally { if (output != null) { try { output.flush(); } catch (IOException e) { Log.e("Error writing file : ", e.getMessage()); } finally { try { output.close(); } catch (IOException e) { Log.e("Error writing file : ", e.getMessage()); } } } } } }).start(); } private void rawToWave(final File rawFile, final File waveFile) throws IOException { byte[] rawData = new byte[(int) rawFile.length()]; DataInputStream input = null; try { input = new DataInputStream(new FileInputStream(rawFile)); input.read(rawData); } finally { if (input != null) { input.close(); } } DataOutputStream output = null; try { output = new DataOutputStream(new FileOutputStream(waveFile));
Use the following permissions in the manifest
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
source share