12/08/2018, 17:12

Android Audio Recorder

1. Giới thiệu Android SDK cung cấp khá nhiều api hữu dụng để khai thác các chức năng trên smartphone, bao gồm cả ghi âm và phát audio. Trong bài này mình sẽ hướng dẫn tạo 1 ứng dụng đơn giản thực hiện ghi âm và play audio sử dụng MediaRecorder API của Android SDK 2. Xây dựng giao diện ...

1. Giới thiệu

  • Android SDK cung cấp khá nhiều api hữu dụng để khai thác các chức năng trên smartphone, bao gồm cả ghi âm và phát audio. Trong bài này mình sẽ hướng dẫn tạo 1 ứng dụng đơn giản thực hiện ghi âm và play audio sử dụng MediaRecorder API của Android SDK

2. Xây dựng giao diện đơn giản cho ứng dụng

  • Trước tiên ta sẽ xây dựng giao diện đơn giản cho ứng dụng Audio Recorder. Giao diện của chúng ta sẽ có 3 button thực hiện các chức năng: bắt đầu ghi âm, dừng ghi âm, play audio
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_awidth="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_awidth="250dp"
        android:layout_height="250dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:src="@drawable/logo_ssaurel"
        android:id="@+id/logo"/>
    <Button
        android:layout_awidth="wrap_content"
        android:layout_height="wrap_content"
        android:text="Record"
        android:textSize="20sp"
        android:id="@+id/record"
        android:layout_below="@id/logo"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="15dp"
        />
    <Button
        android:layout_awidth="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop"
        android:textSize="20sp"
        android:id="@+id/stop"
        android:layout_below="@id/record"
        android:layout_marginTop="10dp"
        android:layout_centerHorizontal="true"
        />
    <Button
        android:layout_awidth="wrap_content"
        android:layout_height="wrap_content"
        android:text="Play"
        android:textSize="20sp"
        android:id="@+id/play"
        android:layout_below="@id/stop"
        android:layout_marginTop="10dp"
        android:layout_centerHorizontal="true"
        />
</RelativeLayout>

3. Ghi âm và play audio

  • Tiếp theo ta sẽ viết 1 đoạn java code thực hiện các việc trên
  • Đầu tiên ta sẽ thêm listener cho button để bắt sự kiện của user khi click vào button
MainActivity.java
public class MainActivity extends AppCompatActivity {
    private Button play, stop, record;
    private MediaRecorder myAudioRecorder;
    private String outputFile;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        play = (Button) findViewById(R.id.play);
        stop = (Button) findViewById(R.id.stop);
        record = (Button) findViewById(R.id.record);
        stop.setEnabled(false);
        play.setEnabled(false);
        // ...
   }
   
}
  • Ta cần phải disable button stop và play khi activity khởi tạo thông qua method setEnable() với parameter false. Tiếp theo ta cần đường link đến file sẽ lưu audio khi ta thực hiện xong ghi âm
String outputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp";
  • Tiếp theo ta cần configure đối tượng MediaRecorder để thực hiện ghi âm:
MediaRecorder myAudioRecorder = new MediaRecorder();
myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myAudioRecorder.setOutputFile(outputFile);
  • Tiếp theo ta sẽ bắt đầu ghi âm khi người dùng click record button
record.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                myAudioRecorder.prepare();
                myAudioRecorder.start();
            } catch (IllegalStateException ise) {
                // make something ...
            } catch (IOException ioe) {
                // make something
            }
            record.setEnabled(false);
            stop.setEnabled(true);
            Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
        }
    });
  • Ta cần gọi phương thức prepare() trước khi gọi phương thức start() để băt đầu ghi âm
  • Ta thực hiện tương tự với stop button
stop.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          myAudioRecorder.stop();
          myAudioRecorder.release();
          myAudioRecorder = null;
          record.setEnabled(true);
          stop.setEnabled(false);
          play.setEnabled(true);
          Toast.makeText(getApplicationContext(), "Audio Recorder stopped", Toast.LENGTH_LONG).show();
      }
  });
  • Ta thực hiện stop ghi âm bởi phương thức stop(), sau đó phải thực hiện release()
  • Bây giờ ta đã có file audio được ghi âm và lưu tại path ta tạo trước đó, và ta có thể play audio từ file ta vừa tạo
play.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        MediaPlayer mediaPlayer = new MediaPlayer();
        try {
            mediaPlayer.setDataSource(outputFile);
            mediaPlayer.prepare();
            mediaPlayer.start();
            Toast.makeText(getApplicationContext(), "Playing Audio", Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            // make something
        }
    }
});
  • Để play audio file ta sẽ sử dụng MediaPlayer API. Sử dụng phương thức setDataSource() để chỉ định file sẽ play, trước khi start play ta cần gọi phương thức prepare().
  • Code hoàn chỉnh cho file MainActivity.java
MainActivity.java
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private Button play, stop, record;
    private MediaRecorder myAudioRecorder;
    private String outputFile;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        play = (Button) findViewById(R.id.play);
        stop = (Button) findViewById(R.id.stop);
        record = (Button) findViewById(R.id.record);
        stop.setEnabled(false);
        play.setEnabled(false);
        outputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp";
        myAudioRecorder = new MediaRecorder();
        myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        myAudioRecorder.setOutputFile(outputFile);
        
        record.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    myAudioRecorder.prepare();
                    myAudioRecorder.start();
                } catch (IllegalStateException ise) {
                    // make something ...
                } catch (IOException ioe) {
                    // make something
                }
                record.setEnabled(false);
                stop.setEnabled(true);
                Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
            }
        });
        
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myAudioRecorder.stop();
                myAudioRecorder.release();
                myAudioRecorder = null;
                record.setEnabled(true);
                stop.setEnabled(false);
                play.setEnabled(true);
                Toast.makeText(getApplicationContext(), "Audio Recorder successfully", Toast.LENGTH_LONG).show();
            }
        });
        
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaPlayer mediaPlayer = new MediaPlayer();
                try {
                    mediaPlayer.setDataSource(outputFile);
                    mediaPlayer.prepare();
                    mediaPlayer.start();
                    Toast.makeText(getApplicationContext(), "Playing Audio", Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    // make something
                }
            }
        });
    }
}

source

0