Audio Capture trong Android




Android có một Microphone được xây dựng sẵn, thông qua đó bạn có thể nắm bắt âm thanh, lưu giữ nó hoặc play nó trên điện thoại. Có nhiều cách để thực hiện điều này nhưng cách phổ biến nhất là thông qua lớp MediaRecorder.

Android cung cấp lớp MediaRecorder để ghi âm audio và video. Để sử dụng lớp MediaRecorder này, đầu tiên bạn tạo một instance của lớp MediaRecorder. Cú pháp như sau:

MediaRecorder myAudioRecorder = new MediaRecorder();

Bây giờ bạn sẽ thiết lập source, định dạng output, định dạng encoding và output file. Cú pháp của chúng là:

myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myAudioRecorder.setOutputFile(outputFile);

Sau khi xác định chúng, chúng ta có thể gọi hai phương thức cơ bản để chuẩn bị và bắt đầu ghi âm audio:

myAudioRecorder.prepare();
myAudioRecorder.start();

Ngoài các phương thức này, lớp MediaRecorder còn có một số phương thức khác cung cấp cho bạn nhiều sự điều khiển hơn tới việc thu âm audio và video.

Stt Phương thức & Miêu tả
1 setAudioSource()

Phương thức này xác định source của audio để được thu âm

2 setVideoSource()

Phương thức này xác định source của video để được thu âm

3 setOutputFormat()

Phương thức này xác định định dạng audio để được lưu giữ

4 setAudioEncoder()

Phương thức này xác định bộ mã hóa audio để được sử dụng

5 setOutputFile()

Phương thức này cấu hình path tới file trong đó audio được lưu giữ

6 stop()

Phương thức này dừng tiến trình thu âm

7 release()

Phương thức này nên được gọi khi cần đến recoder

Ví dụ

Ứng dụng Android dưới đây sử dụng lớp MediaRecorder để tạo ứng dụng Audio Capture và sử dụng lớp MediaPlayer để play audio.

Sau đây là nội dung của src/MainActivity.java

package com.example.sairamkrishna.myapplication;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;

import android.os.Bundle;
import android.os.Environment;

import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;

import android.widget.ImageView;
import android.widget.Toast;
import java.io.IOException;


public class MainActivity extends Activity {
   Button play,stop,record;
   private MediaRecorder myAudioRecorder;
   private String outputFile = null;
   
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      play=(Button)findViewById(R.id.button3);
      stop=(Button)findViewById(R.id.button2);
      record=(Button)findViewById(R.id.button);
      
      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 e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }
            
            catch (IOException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }
            
            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;
            
            stop.setEnabled(false);
            play.setEnabled(true);
            
            Toast.makeText(getApplicationContext(), "Audio recorded successfully",Toast.LENGTH_LONG).show();
         }
      });
      
      play.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) throws IllegalArgumentException,SecurityException,IllegalStateException {
            MediaPlayer m = new MediaPlayer();
            
            try {
               m.setDataSource(outputFile);
            }
            
            catch (IOException e) {
               e.printStackTrace();
            }
            
            try {
               m.prepare();
            }
            
            catch (IOException e) {
               e.printStackTrace();
            }
            
            m.start();
            Toast.makeText(getApplicationContext(), "Playing audio", Toast.LENGTH_LONG).show();
         }
      });
   }
   
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.menu_main, menu);
      return true;
   }
   
   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
      // Handle action bar item clicks here. The action bar will
      // automatically handle clicks on the Home/Up button, so long
      // as you specify a parent activity in AndroidManifest.xml.
      
      int id = item.getItemId();
      
      //noinspection SimplifiableIfStatement
      if (id == R.id.action_settings) {
         return true;
      }
      return super.onOptionsItemSelected(item);
   }
}

Sau đây là nội dung của activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" 
   android:layout_width="match_parent"
   android:layout_height="match_parent" 
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" 
   tools:context=".MainActivity">
   
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Android Audio Recording"
      android:id="@+id/textView"
      android:textSize="30dp"
      android:layout_alignParentTop="true"
      android:layout_alignParentRight="true"
      android:layout_alignParentEnd="true" />
      
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorialspoint"
      android:id="@+id/textView2"
      android:textColor="#ff3eff0f"
      android:textSize="35dp"
      android:layout_below="@+id/textView"
      android:layout_centerHorizontal="true" />
      
   <ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageView"
      android:src="@drawable/logo"
      android:layout_below="@+id/textView2"
      android:layout_alignLeft="@+id/textView2"
      android:layout_alignStart="@+id/textView2"
      android:layout_alignRight="@+id/textView2"
      android:layout_alignEnd="@+id/textView2" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Record"
      android:id="@+id/button"
      android:layout_below="@+id/imageView"
      android:layout_alignParentLeft="true"
      android:layout_alignParentStart="true"
      android:layout_marginTop="59dp" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Stop"
      android:id="@+id/button2"
      android:layout_alignTop="@+id/button"
      android:layout_centerHorizontal="true" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="play"
      android:id="@+id/button3"
      android:layout_alignTop="@+id/button2"
      android:layout_alignRight="@+id/textView"
      android:layout_alignEnd="@+id/textView" />

</RelativeLayout>

Sau đây là nội dung của Strings.xml

<resources>
   <string name="app_name">My Application</string>
   <string name="hello_world">Hello world!</string>
   <string name="action_settings">Settings</string>
</resources>

Sau đây là nội dung của AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.audiocapture"
   android:versionCode="1"
   android:versionName="1.0" >
   
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.RECORD_AUDIO" /> 

   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      
      <activity
         android:name="com.example.audiocapture.MainActivity"
         android:label="@string/app_name" >
      
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      
      </activity>
      
   </application>
</manifest>

Cuối cùng, bạn chạy ứng dụng Android vừa tạo ở trên.

Bây giờ, theo mặc định bạn sẽ thấy các nút STOP và PLAY là disable. Nhấn nút RECORD và ứng dụng bắt đầu thu âm. Nó sẽ hiển thị màn hình sau:

Audio trong Android

Bây giờ, nhấn nút STOP và nó sẽ lưu phần audio đã được ghi âm vào thẻ sd ngoại vi. Khi bạn nhấn nút STOP, màn hình sẽ hiển thị:

Audio trong Android

Bây giờ, nhấn nút PLAY và phần audio đã được ghi âm sẽ bắt đầu play trên thiết bị. Thông báo sau xuất hiện khi bạn nhấn nút PLAY.

Audio trong Android
Loading...
Loading...

Follow https://www.facebook.com/vietjackteam/ để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.