menu

ضبط صدا (Audio Capture) در اندروید

نحوه ساخت یک برنامه ضبط صدا (Audio Capture) در اندروید را فرا بگیرید


با استفاده از سیستم عامل اندروید می توانید گوشی هوشمند خود را تبدیل به یک میکروفون نموده و صدایی را ضبط، پخش و یا متوقف نمایید.

برای ساخت یک برنامه ضبط صدا در اندروید راه های مختلفی وجود دارد که برای نمونه از کلاس "MediaRecorder" استفاده می نماییم.

برای استفاده از کلاس "MediaRecorder" ابتدا باید یک نمونه از این کلاس ایجاد نماییم. برای این کار مطابق کد نوشته شده در زیر عمل می کنیم:

          
     // ساخت یک نمونه از کلاس موردنظر     
   MediaRecorder audiocapture = new MediaRecorder();       
          

پس از ساخت نمونه می توانیم از توابع و متدهای کلاس استفاده کنیم. این متد ها برای مشخص کردن منبع صوتی، فرمت خروجی صدا، انکد کردن صدا و فایل خروجی می باشند.

          
     // برخی از توابع مهم کلاس ساخته شده     
   audiocapture.setAudioSource(MediaRecorder.AudioSource.MIC);
   audiocapture.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
   audiocapture.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
   audiocapture.setOutputFile(outputFile);       
          

پس از فراخوانی متد های گفته شده، می توانیم متدهای آماده سازی و آغاز ضبط صدا را فراخوانی نماییم:

          
   audiocapture.prepare();
   audiocapture.start();    
          

اکنون درباره متدهای گفته شده توضیحات بیشتری می دهیم تا دلیل استفاده هرکدام را فرا بگیرید

نام متد توضیح
()setAudioSource این متد منبع صوتی برای ضبط صدا را مشخص می نماید.
()setOutputFormat این متد فرمت خروجی صدا را مشخص می نماید.
()setAudioEncoder این متد انکدر استفاده شده برای صدا را مشخص می کند.
()setOutputFile این متد ذخیره صدای ضبط شده را مشخص می کند.
()stop برای توقف فرآیند ضبط صدا از این متد استفاده می نماییم.

مراحل انجام کار

  • 1 - ابتدا مطابق با آموزش ساخت اولین پروژه اندرویدی یک پروژه جدید بسازید و نام آن را "Audio Capture" قرار دهید.
  • 2 - کدهای مربوط به لایه طراحی شده در آموزش را جایگزین کدهای لایه پروژه خود کنید.
  • 3 - فایل MainActivity.java را باز کرده و کدهای جدید نوشته شده موجود در آموزش را در آن اضافه نمایید.
  • 4 - پروژه را اجرا نموده و برروی شبیه ساز آن را تست کنید.

1 - ایجاد لایه گرافیکی audio_capture.xml

ابتدا یک لایه ایجاد نموده و درون آن عناصر لازم برای برنامه ضبط صدا را اضافه می کنیم. این لایه درون پوشه "res/layout/audio_capture.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_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

     <TextView
        android:layout_width="fill_parent"
        android:layout_height="100dp"
        android:text="برنامه ضبط صدا"
        android:id="@+id/textView"
        android:background="#e7e7e7"
        android:gravity="center"
        android:textColor="#000"
        android:textSize="24dp"
        android:textStyle="bold" />

     <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="100dp"
        android:layout_below="@+id/textView">

         <Button
            android:layout_width="0dp"
            android:layout_height="60dp"
            android:text="ضبط"
            android:id="@+id/btnrecord"
            android:layout_below="@+id/textView"
            android:layout_marginTop="20dp"
            android:textColor="#000"
            android:textSize="18dp"
            android:textStyle="bold"
            android:layout_weight="0.33"/>

         <Button
            android:layout_width="0dp"
            android:layout_height="60dp"
            android:text="توقف"
            android:id="@+id/btnstop"
            android:layout_below="@+id/textView"
            android:layout_marginTop="20dp"
            android:textColor="#000"
            android:textSize="18dp"
            android:textStyle="bold"
            android:layout_weight="0.33" />

         <Button
            android:layout_width="0dp"
            android:layout_height="60dp"
            android:text="پخش"
            android:id="@+id/btnplay"
            android:layout_below="@+id/textView"
            android:layout_marginTop="20dp"
            android:textColor="#000"
            android:textSize="18dp"
            android:textStyle="bold"
            android:layout_weight="0.33" />
     </LinearLayout>

     <TextView
        android:text="طراحی شده توسط آکادمی مجازی ذره بین"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:textColor="#000"
        android:textSize="20dp"
        android:textStyle="bold" />

   </RelativeLayout>
         

2 - MainActivity.java

      
  package com.izarebin.audiocapture;

  import android.media.MediaPlayer;
  import android.media.MediaRecorder;
  import android.os.Environment;
  import android.support.v7.app.AppCompatActivity;
  import android.os.Bundle;
  import android.view.View;
  import android.widget.Button;
  import android.widget.Toast;
  import java.io.IOException;

  public class MainActivity extends AppCompatActivity {
    Button btnrecord,btnstop,btnplay;
    MediaRecorder audiocapture;
    String outputfile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.audio_capture);

        btnrecord = (Button) findViewById(R.id.btnrecord);
        btnstop = (Button) findViewById(R.id.btnstop);
        btnplay = (Button) findViewById(R.id.btnplay);
         // غیرفعال کردن دکمه های پخش و توقف
        btnplay.setEnabled(false);
        btnstop.setEnabled(false);
        // مشخص نمودن محل  ذخیره صدای ضبط شده
        outputfile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp";
        // ساخت نمونه کلاس
        audiocapture = new MediaRecorder();
        // فراخوانی متدهای موردنیاز برای ضبط صدا
        audiocapture.setAudioSource(MediaRecorder.AudioSource.MIC);
        audiocapture.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        audiocapture.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        audiocapture.setOutputFile(outputfile);
        
        btnrecord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    // آماده سازی و آغاز ضبط صدا
                    audiocapture.prepare();
                    audiocapture.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // غیرفعال کردن دکمه پخش و فعال کردن دکمه توقف
                btnplay.setEnabled(false);
                btnstop.setEnabled(true);
                Toast.makeText(MainActivity.this, "ضبط صدا آغاز شد", Toast.LENGTH_SHORT).show();
            }
        });
 
        btnstop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // توقف ضبط و ایجاد صدا
                audiocapture.stop();
                audiocapture.release();
                audiocapture  = null;
                // غیرفعال کردن دکمه توقف و فعال کردن دکمه پخش
                btnstop.setEnabled(false);
                btnplay.setEnabled(true);
                Toast.makeText(MainActivity.this, "صدای ضبط شده ذخیره گردید", Toast.LENGTH_SHORT).show();
            }
        });

        btnplay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 // ساخت یک نمونه از کلاس مدیاپلیر برای پخش صدا
                MediaPlayer md = new MediaPlayer();
                try {
                    // مشخص نمودن منبع داده برای پخش
                    md.setDataSource(outputfile);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    // آماده سازی
                    md.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                 // آغاز پخش صدا
                md.start();
            }
        });
    }
  }        
           

3 - AndroidManifest.xml

برای امکان استفاده از ضبط صدا نیاز به دو دسترسی در اپلیکیشن داریم که باید به اندروید منیفست اضافه شوند.

          
  <?xml version="1.0" encoding="utf-8"?>
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.izarebin.audiocapture" >

     // دسترسی های موردنیاز برای برنامه ضبط صدا
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
        </activity>
    </application>

  </manifest>        
          

4 - اجرای برنامه برروی شبیه ساز

شکل پروژه طراحی شده به صورت زیر خواهد بود:

audiocapture1
سورس پروژه برنامه ضبط صدا (Audio Capture) برای محیط اندروید استودیو را می توانید از این لینک دریافت نمایید.