ضبط صدا در اندروید

منتشرشده توسط حامد قنبری در تاریخ

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

 

از این کلاس به منظور  ضبط صدا یا ویدئو استفاده می شود که همانند دیگر مدیا کنترلر ها داری توابعی همچون پخش / مکث، عقب، سریع به جلو و نوار لغزنده   می باشد فلذا برای استفاده از  این کلاس ابتدا MediaRecorder ابتدا آبجکتی  از کلاس MediaRecorder فراخوانی می کنیم:

MediaRecorder myAudioRecorder = new MediaRecorder();

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

myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

 

فرمت خروجی فایل صوتی رامشخص می کنید که در این مثال :

myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);

توجه داشته باشید که فرمت AMR_NB در API سطح 16  به بعد نادیده گرفته شد و این فرمت بیشتر در دستگاه اندرویدی قدیمی مورد استفاده قرار می گرفت.

مسر فایل خروجی را تنظیم می کنید. نحو آن در زیر آمده است.

PathAudioRecorder =                   Environment.getExternalStorageDirectory().getAbsolutePath() + “/” +                      CreateFileName(4) + “Track.3gp”;

 

myAudioRecorder.setOutputFile(PathAudioRecorder);

نهایتا بعد از مشخص کردن منبع صوتی و فرمت و فایل خروجی آن می توانیم دو متد اصلی را برای ضبط کردن صوت آماده کنیم و شروع به ضبط صدا کنیم.

myAudioRecorder.prepare();

myAudioRecorder.start();

 

به غیر متدهای ذکر شده ، متدهای دیگر یدر کلاس MediaRecorder وجود دارد که به شما امکان کنترل بیشتری بر روی ضبط صدا و تصویر را می دهد.که در ذیل به چند مورد از آنها اشاره می کنیم

()setAudioSource

این روش منبع صدای ضبط شده را مشخص می کند

()setVideoSource

این روش منبع ویدئوی ضبط شده را مشخص می کند

()setOutputFormat

این روش فرمت صوتی را مشخص می کند که در آن صدا ذخیره می شود

()setAudioEncoder

این روش رمزگذار صوتی را که مورد استفاده قرار می گیرد تعیین می کند

()setOutputFile

این روش مسیر فایل را که صوتی ضبط شده ذخیره می شود تنظیم می کند

()stop

این روش روند ضبط را متوقف می کند.

()release

این روش هنگام نامگذاری ضبط مورد نیاز است.

به منظور درک بیشتر موضوع بهتر است مثالی در این خصوص ارائه کنیم . امید است که این مثال در امر یادگیری شما موثر بوده باشد.

اگر در داخل برنامه اکلیپس یا اندروید استودیو قرار دارید پروژه جدیدی را  ایجاد کنید

اکلیپس :File ⇒ New Android ⇒ Application Project

اندروید استودیو :File ⇒ New  ⇒ New Project

اما اگر هنوز برنامه خود را باز نکرده اید یکی از برنامه های فوق را باز نموده و بعد از تعیین مشخصات(نامگذاری) ، تعیین حداقل sdk  و نوع اکتیویتی (blank  یا Empty) ، نام اکتیویتی ابتدایی و اصلی خود  را همان MainActivity قرار دهید. بعد از لود کامل برنامه ، در مسیر res ⇒layout لایه متناظر اکتیوتی اصلی یعنی 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_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="STOP"
        android:id="@+id/button2"
        android:layout_below="@+id/button"
        android:layout_alignRight="@+id/button"
        android:layout_alignEnd="@+id/button"
        android:layout_alignLeft="@+id/button"
        android:layout_alignStart="@+id/button" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="STOP PLAYING RECORDING "
        android:id="@+id/button4"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Record Sound"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="41dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Play Recorded"
        android:id="@+id/button3"
        android:layout_above="@+id/button4"
        android:layout_alignLeft="@+id/button4"
        android:layout_alignStart="@+id/button4"
        android:layout_alignRight="@+id/button4"
        android:layout_alignEnd="@+id/button4" />
</RelativeLayout>

سپس کلاس اصلی یعنی MainActivity.java را باز کرده و کدهای زیر را در آن قرار دهید:

package ir.example.psrd.RecordSound;


import android.app.Activity;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;
import java.util.Random;

import static android.Manifest.permission.RECORD_AUDIO;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

public class MainActivity extends Activity {

    Button BtnStart, BtnStob, buttonPlayLastRecordAudio,
            btnStopPlayingRecording ;
    String AudioSavePathInDevice = null;
    MediaRecorder MRcord ;
    Random random ;
    String RandomAudioFileName = "ABCDEFGHIJKLMNOP";
    public static final int RequestPermissionCode = 1;
    MediaPlayer MPlayer ;

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

        BtnStart = (Button) findViewById(R.id.button);
        BtnStob = (Button) findViewById(R.id.button2);
        buttonPlayLastRecordAudio = (Button) findViewById(R.id.button3);
        btnStopPlayingRecording = (Button)findViewById(R.id.button4);

        BtnStob.setEnabled(false);
        buttonPlayLastRecordAudio.setEnabled(false);
        btnStopPlayingRecording.setEnabled(false);

        random = new Random();

        BtnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (checkPermission()) {

                    AudioSavePathInDevice =
                            Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
                                    CrreateNameAudioFile(5) + "AudioRecording.3gp";

                    MediaRecorderReady();

                    try {
                        MRcord.prepare();
                        MRcord.start();
                    } catch (IllegalStateException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    BtnStart.setEnabled(false);
                    BtnStob.setEnabled(true);

                    Toast.makeText(MainActivity.this, "Recording started",
                            Toast.LENGTH_LONG).show();
                } else {
                    requestPermission();
                }

            }
        });

        BtnStob.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MRcord.stop();
                BtnStob.setEnabled(false);
                buttonPlayLastRecordAudio.setEnabled(true);
                BtnStart.setEnabled(true);
                btnStopPlayingRecording.setEnabled(false);

                Toast.makeText(MainActivity.this, "Recording Completed",
                        Toast.LENGTH_LONG).show();
            }
        });

        buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) throws IllegalArgumentException,
                    SecurityException, IllegalStateException {

                BtnStob.setEnabled(false);
                BtnStart.setEnabled(false);
                btnStopPlayingRecording.setEnabled(true);

                MPlayer = new MediaPlayer();
                try {
                    MPlayer.setDataSource(AudioSavePathInDevice);
                    MPlayer.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                MPlayer.start();
                Toast.makeText(MainActivity.this, "Recording Playing",
                        Toast.LENGTH_LONG).show();
            }
        });

        btnStopPlayingRecording.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                BtnStob.setEnabled(false);
                BtnStart.setEnabled(true);
                btnStopPlayingRecording.setEnabled(false);
                buttonPlayLastRecordAudio.setEnabled(true);

                if (MPlayer != null) {
                    MPlayer.stop();
                    MPlayer.release();
                    MediaRecorderReady();
                }
            }
        });

    }

    public void MediaRecorderReady(){
        MRcord=new MediaRecorder();
        MRcord.setAudioSource(MediaRecorder.AudioSource.MIC);
        MRcord.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        MRcord.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        MRcord.setOutputFile(AudioSavePathInDevice);
    }

    public String CrreateNameAudioFile(int string){
        StringBuilder stringBuilder = new StringBuilder( string );
        int i = 0 ;
        while(i < string ) {
            stringBuilder.append(RandomAudioFileName.
                    charAt(random.nextInt(RandomAudioFileName.length())));

            i++ ;
        }
        return stringBuilder.toString();
    }

    private void requestPermission() {
        ActivityCompat.requestPermissions(MainActivity.this, new
                String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case RequestPermissionCode:
                if (grantResults.length> 0) {
                    boolean StoragePermission = grantResults[0] ==
                            PackageManager.PERMISSION_GRANTED;
                    boolean RecordPermission = grantResults[1] ==
                            PackageManager.PERMISSION_GRANTED;

                    if (StoragePermission && RecordPermission) {
                        Toast.makeText(MainActivity.this, "Permission Granted",
                                Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(MainActivity.this,"Permission Denied",Toast.LENGTH_LONG).show();
                    }
                }
                break;
        }
    }

    public boolean checkPermission() {
        int result = ContextCompat.checkSelfPermission(getApplicationContext(),
                WRITE_EXTERNAL_STORAGE);
        int result1 = ContextCompat.checkSelfPermission(getApplicationContext(),
                RECORD_AUDIO);
        return result == PackageManager.PERMISSION_GRANTED &&
                result1 == PackageManager.PERMISSION_GRANTED;
    }
}

 

لازم است که به منظور گرفتن مجوز از سیبستم اندروید ، فایل Androidmanifest.xml  را باز کرده و مجوزهای مشخص شده به رنگ قرمز را به آن اضافه کنیم:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ir.example.psrd.RecordSound">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="psrd.ir"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

حال می توانید پروژه خود را اجرا کرده و نتیجه کار خودتان را ببینید. اگر مشکلی در اجرای کدها دارید یا سوال به خصوصی ذهن شما را مشغول کرده است می توانید در قسمت دیدگاه آن را مطرح کنید. باعث خرسندی ما خواهد بود که پاسخگوی سوالات تخصصی شما باشیم.

 

 

 


0 دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

-- بارگیری کد امنیتی --