Tuesday, 30 April 2013

Audio Recorder in Android


The android.media.AudioRecord class manages the audio resources for Java applications to record audio from the audio input hardware of the platform.



record.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="HB-Record Audio" />

    <Button
        android:id="@+id/startrec"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Start Recording" />

    <Button
        android:id="@+id/stoprec"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Stop Recording" />

    <Button
        android:id="@+id/playback"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Play Back" />

</LinearLayout>


AndroidAudioRecordActivity:

public class AndroidAudioRecordActivity extends Activity
{

      Button startRecstopRecplayBack;
      Boolean recording;
     
      @Override
      public void onCreate(Bundle savedInstanceState)
      {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.record);
           
            startRec = (Button)findViewById(R.id.startrec);
            stopRec = (Button)findViewById(R.id.stoprec);
            playBack = (Button)findViewById(R.id.playback);

            startRec.setOnClickListener(startRecOnClickListener);
            stopRec.setOnClickListener(stopRecOnClickListener);
            playBack.setOnClickListener(playBackOnClickListener);

      }

      OnClickListener startRecOnClickListener   = new OnClickListener()
      {
            @Override
            public void onClick(View arg0)
            {
                  Thread recordThread = new Thread(new Runnable()
                  {
                        @Override
                        public void run()
                        {
                              recording = true;
                              startRecord();
                        }

                  });

                  recordThread.start();
            }};

            OnClickListener stopRecOnClickListener = new OnClickListener()
            {
                  @Override
                  public void onClick(View arg0)
                  {
                        recording = false;
                  }};

                  OnClickListener playBackOnClickListener   = new OnClickListener()
                  {

                        @Override
                        public void onClick(View v)
                        {
                              playRecord();
                        }

                  };

                  private void startRecord()
                  { 
                        File file = new File(Environment.getExternalStorageDirectory(),"test.pcm");

                        try
                        {
                              file.createNewFile();

                              OutputStream outputStream = new FileOutputStream(file);
                              BufferedOutputStream bufferedOutputStream = newBufferedOutputStream(outputStream);
                              DataOutputStream dataOutputStream = newDataOutputStream(bufferedOutputStream);

                              int minBufferSize = AudioRecord.getMinBufferSize(11025,
                                          AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                          AudioFormat.ENCODING_PCM_16BIT);

                              short[] audioData = new short[minBufferSize];

                              AudioRecord audioRecord = newAudioRecord(MediaRecorder.AudioSource.MIC,
                                          11025,
                                          AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                          AudioFormat.ENCODING_PCM_16BIT,
                                          minBufferSize);

                              audioRecord.startRecording();

                              while(recording)
                              {
                                    int numberOfShort = audioRecord.read(audioData, 0, minBufferSize);
                                    for(int i = 0; i < numberOfShort; i++)
                                    {
                                          dataOutputStream.writeShort(audioData[i]);
                                    }
                              }
                              audioRecord.stop();
                              dataOutputStream.close();

                        }
                        catch (IOException e)
                        {
                              e.printStackTrace();
                        }

                  }

                  void playRecord()
                  {
                        File file = new File(Environment.getExternalStorageDirectory(),"test.pcm");

                        int shortSizeInBytes = Short.SIZE/Byte.SIZE;

                        int bufferSizeInBytes = (int)(file.length()/shortSizeInBytes);
                        short[] audioData = new short[bufferSizeInBytes];

                        try {
                              InputStream inputStream = new FileInputStream(file);
                              BufferedInputStream bufferedInputStream = newBufferedInputStream(inputStream);
                              DataInputStream dataInputStream = newDataInputStream(bufferedInputStream);

                              int i = 0;
                              while(dataInputStream.available() > 0)
                              {
                                    audioData[i] = dataInputStream.readShort();
                                    i++;
                              }

                              dataInputStream.close();

                              AudioTrack audioTrack = new AudioTrack(
                                          AudioManager.STREAM_MUSIC,
                                          11025,
                                          AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                          AudioFormat.ENCODING_PCM_16BIT,
                                          bufferSizeInBytes,
                                          AudioTrack.MODE_STREAM);

                              audioTrack.play();
                              audioTrack.write(audioData, 0, bufferSizeInBytes);


                        } catch (FileNotFoundException e)
                        {
                              e.printStackTrace();
                        } catch (IOException e)
                        {
                              e.printStackTrace();
                        }
                  } 
}

Permission:
  <uses-permission android:name="android.permission.RECORD_AUDIO" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Click here for more ref Link: