Advertisement
alfacentaury

RecordAudioSample.java

Apr 25th, 2017
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.07 KB | None | 0 0
  1. package com.example.asus.biometriksuara;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.content.SharedPreferences;
  6. import android.media.AudioFormat;
  7. import android.media.AudioRecord;
  8. import android.media.MediaRecorder;
  9. import android.os.Bundle;
  10. import android.os.Environment;
  11. import android.util.Log;
  12. import android.view.View;
  13. import android.widget.Button;
  14.  
  15. import java.io.File;
  16. import java.io.FileInputStream;
  17. import java.io.FileNotFoundException;
  18. import java.io.FileOutputStream;
  19. import java.io.IOException;
  20.  
  21. public class RecordAudioSample extends Activity {
  22.     private static final int RECORDER_BPP = 16;
  23.     private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
  24.     private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
  25.     private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
  26.     private static final int RECORDER_SAMPLERATE = Constant.SampleRate;
  27.     private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
  28.     private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
  29.     private long VOICE_ID;
  30.     private AudioRecord recorder = null;
  31.     private int bufferSize = 0;
  32.     private Thread recordingThread = null;
  33.     private boolean isRecording = false;
  34.     private String outFile = "";
  35.  
  36.  
  37.     SharedPreferences prefs;
  38.     SharedPreferences.Editor editor;
  39.  
  40.     @Override
  41.     public void onCreate(Bundle savedInstanceState) {
  42.         super.onCreate(savedInstanceState);
  43.         setContentView(R.layout.main);
  44.  
  45.         setButtonHandlers();
  46.         enableButtons(false);
  47.  
  48.         bufferSize = AudioRecord.getMinBufferSize(Constant.SampleRate,
  49.                 AudioFormat.CHANNEL_IN_MONO,
  50.                 AudioFormat.ENCODING_PCM_16BIT);
  51.     }
  52.  
  53.     private void setButtonHandlers() {
  54.         ((Button) findViewById(R.id.btnStart)).setOnClickListener(btnClick);
  55.         ((Button) findViewById(R.id.btnStop)).setOnClickListener(btnClick);
  56.     }
  57.  
  58.     private void enableButton(int id, boolean isEnable) {
  59.         ((Button) findViewById(id)).setEnabled(isEnable);
  60.     }
  61.  
  62.     private void enableButtons(boolean isRecording) {
  63.         enableButton(R.id.btnStart, !isRecording);
  64.         enableButton(R.id.btnStop, isRecording);
  65.     }
  66.  
  67.     private String getFilename() {
  68.         String filepath = Environment.getExternalStorageDirectory().getPath();
  69.         File file = new File(filepath, AUDIO_RECORDER_FOLDER);
  70.  
  71.         if (!file.exists()) {
  72.             file.mkdirs();
  73.         }
  74.         VOICE_ID = System.currentTimeMillis();
  75.         return (file.getAbsolutePath() + "/" + VOICE_ID + AUDIO_RECORDER_FILE_EXT_WAV);
  76.     }
  77.  
  78.     private String getTempFilename() {
  79.         String filepath = Environment.getExternalStorageDirectory().getPath();
  80.         File file = new File(filepath, AUDIO_RECORDER_FOLDER);
  81.  
  82.         if (!file.exists()) {
  83.             file.mkdirs();
  84.         }
  85.  
  86.         File tempFile = new File(filepath, AUDIO_RECORDER_TEMP_FILE);
  87.  
  88.         if (tempFile.exists())
  89.             tempFile.delete();
  90.  
  91.         return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_TEMP_FILE);
  92.     }
  93.  
  94.     private void startRecording() {
  95.         recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT,
  96.                 RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSize);
  97.  
  98.         int i = recorder.getState();
  99.         if (i == 1)
  100.             recorder.startRecording();
  101.  
  102.         isRecording = true;
  103.  
  104.         recordingThread = new Thread(new Runnable() {
  105.  
  106.             @Override
  107.             public void run() {
  108.                 writeAudioDataToFile();
  109.             }
  110.         }, "AudioRecorder Thread");
  111.  
  112.         recordingThread.start();
  113.     }
  114.  
  115.     private void writeAudioDataToFile() {
  116.         byte data[] = new byte[bufferSize];
  117.         String filename = getTempFilename();
  118.         FileOutputStream os = null;
  119.  
  120.         try {
  121.             os = new FileOutputStream(filename);
  122.         } catch (FileNotFoundException e) {
  123.             // TODO Auto-generated catch block
  124.             e.printStackTrace();
  125.         }
  126.  
  127.         int read = 0;
  128.         if (null != os) {
  129.             while (isRecording) {
  130.                 read = recorder.read(data, 0, bufferSize);
  131.  
  132.                 if (AudioRecord.ERROR_INVALID_OPERATION != read) {
  133.                     try {
  134.                         os.write(data);
  135.                     } catch (IOException e) {
  136.                         e.printStackTrace();
  137.                     }
  138.                 }
  139.             }
  140.  
  141.             try {
  142.                 os.close();
  143.             } catch (IOException e) {
  144.                 e.printStackTrace();
  145.             }
  146.         }
  147.     }
  148.  
  149.     private void stopRecording() {
  150.         if (null != recorder) {
  151.             isRecording = false;
  152.  
  153.             int i = recorder.getState();
  154.             if (i == 1)
  155.                 recorder.stop();
  156.             recorder.release();
  157.  
  158.             recorder = null;
  159.             recordingThread = null;
  160.         }
  161.  
  162.         copyWaveFile(getTempFilename(), getFilename());
  163.         deleteTempFile();
  164.     }
  165.  
  166.     private void deleteTempFile() {
  167.         File file = new File(getTempFilename());
  168.  
  169.         file.delete();
  170.     }
  171.  
  172.     private void copyWaveFile(String inFilename, String outFilename) {
  173.         FileInputStream in = null;
  174.         FileOutputStream out = null;
  175.         long totalAudioLen = 0;
  176.         long totalDataLen = totalAudioLen + 36;
  177.         long longSampleRate = RECORDER_SAMPLERATE;
  178.         int channels = 1;
  179.         long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels / 8;
  180.  
  181.         byte[] data = new byte[bufferSize];
  182.  
  183.         try {
  184.             in = new FileInputStream(inFilename);
  185.             out = new FileOutputStream(outFilename);
  186.             totalAudioLen = in.getChannel().size();
  187.             totalDataLen = totalAudioLen + 36;
  188.  
  189.             AppLog.logString("File size: " + totalDataLen);
  190.  
  191.             WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
  192.                     longSampleRate, channels, byteRate);
  193.  
  194.             while (in.read(data) != -1) {
  195.                 out.write(data);
  196.             }
  197.  
  198.             in.close();
  199.             out.close();
  200.             outFile = outFilename;
  201.         } catch (FileNotFoundException e) {
  202.             e.printStackTrace();
  203.         } catch (IOException e) {
  204.             e.printStackTrace();
  205.         }
  206.     }
  207.  
  208.     private void WriteWaveFileHeader(
  209.             FileOutputStream out, long totalAudioLen,
  210.             long totalDataLen, long longSampleRate, int channels,
  211.             long byteRate) throws IOException {
  212.  
  213.         byte[] header = new byte[44];
  214.  
  215.         header[0] = 'R';  // RIFF/WAVE header
  216.         header[1] = 'I';
  217.         header[2] = 'F';
  218.         header[3] = 'F';
  219.         header[4] = (byte) (totalDataLen & 0xff);
  220.         header[5] = (byte) ((totalDataLen >> 8) & 0xff);
  221.         header[6] = (byte) ((totalDataLen >> 16) & 0xff);
  222.         header[7] = (byte) ((totalDataLen >> 24) & 0xff);
  223.         header[8] = 'W';
  224.         header[9] = 'A';
  225.         header[10] = 'V';
  226.         header[11] = 'E';
  227.         header[12] = 'f';  // 'fmt ' chunk
  228.         header[13] = 'm';
  229.         header[14] = 't';
  230.         header[15] = ' ';
  231.         header[16] = 16;  // 4 bytes: size of 'fmt ' chunk
  232.         header[17] = 0;
  233.         header[18] = 0;
  234.         header[19] = 0;
  235.         header[20] = 1;  // format = 1
  236.         header[21] = 0;
  237.         header[22] = (byte) channels;
  238.         header[23] = 0;
  239.         header[24] = (byte) (longSampleRate & 0xff);
  240.         header[25] = (byte) ((longSampleRate >> 8) & 0xff);
  241.         header[26] = (byte) ((longSampleRate >> 16) & 0xff);
  242.         header[27] = (byte) ((longSampleRate >> 24) & 0xff);
  243.         header[28] = (byte) (byteRate & 0xff);
  244.         header[29] = (byte) ((byteRate >> 8) & 0xff);
  245.         header[30] = (byte) ((byteRate >> 16) & 0xff);
  246.         header[31] = (byte) ((byteRate >> 24) & 0xff);
  247.         header[32] = (byte) (2 * 16 / 8);  // block align
  248.         header[33] = 0;
  249.         header[34] = RECORDER_BPP;  // bits per sample
  250.         header[35] = 0;
  251.         header[36] = 'd';
  252.         header[37] = 'a';
  253.         header[38] = 't';
  254.         header[39] = 'a';
  255.         header[40] = (byte) (totalAudioLen & 0xff);
  256.         header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
  257.         header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
  258.         header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
  259.  
  260.         out.write(header, 0, 44);
  261.     }
  262.  
  263.     private View.OnClickListener btnClick = new View.OnClickListener() {
  264.         @Override
  265.         public void onClick(View v) {
  266.             switch (v.getId()) {
  267.                 case R.id.btnStart: {
  268.                     AppLog.logString("Start Recording");
  269.  
  270.                     enableButtons(true);
  271.                     startRecording();
  272.  
  273.                     break;
  274.                 }
  275.                 case R.id.btnStop: {
  276.                     AppLog.logString("Start Recording");
  277.  
  278.                     enableButtons(false);
  279.                     stopRecording();
  280.                     SharedPreferences prefs = (SharedPreferences) getSharedPreferences(Constant.PREF_RECORDER, MODE_PRIVATE);
  281.                     SharedPreferences.Editor editor = prefs.edit();
  282.                     if (outFile != "") {
  283.                         Log.d("SAVE_TMP_PREF", "Shared teh temp file in shared preferences . FIle: " + outFile);
  284.                         editor.putString(Constant.PREF_KEY_TMP_FILE, outFile);
  285.                         editor.commit();
  286.  
  287.                         Intent i = new Intent();
  288.                         i.putExtra(Constant.PREF_KEY_TMP_FILE, outFile);
  289.                         if (getParent() == null) {
  290.                             setResult(Activity.RESULT_OK, i);
  291.                         } else {
  292.  
  293.                             getParent().setResult(Activity.RESULT_OK, i);
  294.                         }
  295.                     } else {
  296.                         Log.d("SAVE_TMP_PREF", "Shared teh temp file in shared preferences is empty .File: " + outFile);
  297.                     }
  298.                     finish();
  299.                     break;
  300.                 }
  301.             }
  302.         }
  303.     };
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement