آموزش برنامه نویسی اندروید با اندروید استودیو (بخش چهل و پنجم: Audio Capture )

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

گاهی پیش می آید که بخواهیم در اپلیکیشنی صدا ( Voice ) ی را برای استفاده ضبط نماییم.

این کار توسط MediaRecorder انجام می شود.

در این بخش از برنامه نویسی اندروید، به بررسی MediaRecorder و کار با آن و قابلیت های این ویژگی می پردازیم.

همانند جلسات قبلی، این کار نیز توسط ایجاد یک پروژه ی جدید در اندروید استودیو انجام می شود.

نکته: این جلسه، ما اجزای مختلفی که برای نوشتن پروژه ی Audio Capture لازم است را بررسی میکنیم. ولی در جلسه ی آینده، مثالی عملی تر برای اجرای این ویژگی (Audio Recording) را با هم انجام می دهیم.

طراحی لایه اپلیکیشن

برای شروع کار، من یک پروژه به نام AudioCapture-Gsm در اندروید استودیو ایجاد می کنم.

در پروژه ایجاد شده، به قسمت Layout یعنی همان لایه برنامه می روم و فایل activity_main.xml را باز می کنم.

از قسمت جعبه ابزار ( Palette ) ها ، سه Button را به داخل لایه اپلیکیشن برنامه می کشم.

نام یکی از دکمه ها را Start ، نام دیگری را Stop و نام سومین دکمه را Play می گذارم.

همچنین برای راحتی کار در قسمت کد نویسی، آیدی دکمه Start را StartButton و آیدی دکمه Stop را StopButton و آیدی دکمه Play را PlayButton می گذاریم.

بهتر است برای پروژه ای که ایجاد کردیم یک ImageView نیز به لایه اپلیکیشن اضافه کنیم.

همان طور که در عکس می بینید من یک ImageView با شکل میکروفون اضافه می کنم.

ارتفاع و عرض این ابزار را 100px قرار می دهم.

<ImageView
        android:layout_width="100px"
        android:layout_height="100px"
        app:srcCompat="@android:drawable/presence_audio_online"
        android:layout_alignParentTop="true"
        android:layout_marginTop="75dp"
        android:layout_marginLeft="150dp"
        android:id="@+id/imageView" />

نمای کلی از لایه اپلیکیشن به همراه کد xml آن

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    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"
    tools:context="com.gsm_developers.audiocapture_gsm.MainActivity">

    <Button
        android:text="Start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="50dp"
        android:layout_marginStart="36dp"
        android:layout_marginBottom="194dp"
        android:id="@+id/StartButton" />

    <ImageView
        android:layout_width="100px"
        android:layout_height="100px"
        app:srcCompat="@android:drawable/presence_audio_online"
        android:layout_alignParentTop="true"
        android:layout_marginTop="75dp"
        android:layout_marginLeft="150dp"
        android:id="@+id/imageView" />

    <Button
        android:text="Stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/StopButton"
        android:layout_alignBaseline="@+id/StartButton"
        android:layout_alignBottom="@+id/StartButton"
        android:layout_toRightOf="@+id/imageView"
        android:layout_toEndOf="@+id/imageView" />

    <Button
        android:text="Play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="14dp"
        android:id="@+id/PlayButton"
        android:layout_below="@+id/StopButton"
        android:layout_toRightOf="@+id/StartButton"
        android:layout_toEndOf="@+id/StartButton" />
</RelativeLayout>

شروع کد جاوای اپلیکیشن

پس از اتمام قسمت لایه اپلیکیشن به سراغ قسمت جاوای برنامه  می رویم. تا کدهای جاوا برنامه را بنویسیم.

لازم به ذکر است که در اینجا فقط اجزایی که برای نوشتن یک اپلیکیشن Audio Capture لازم است بررسی می شود. در جلسه ی آینده پروژه ی عملی نوشته می شود.

فایل MainActivity.java را باز کرده و مرحله به مرحله کدهای مورد نظرمان را می نویسیم.

در مرحله اول، کد های زیر را در کلاس MainActivity تعریف نمایید. تا توابعی که بعدا تعریف می کنید به آن ها دسترسی داشته باشند.

private MediaRecorder MyAudioCapture;
private String outputFile = null;
private Button startBtn,stopBtn,playBtn;

توضیح:

در خط اول یک شی از کلاس MediaRecorder با نام MyAudioCapture تعریف می کنیم.

کلاس MediaRecorder باید به برنامه Import شود:

import android.media.MediaRecorder;

در خط دوم یک متغیر از نوع رشته، تعریف می کنیم تا به وسیله ی آن بتوانیم صدای ضبط شده در محلی از حافظه ذخیره کنیم.

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

در قسمت تابع onCreate در کلاس MainActivity  کدهایی را باید نوشت که در هنگام شروع اپلیکیشن اجرا شوند.

در اولین کار، سه دکمه را از قسمت لایه به قسمت کد جاوای برنامه، معرفی می کنیم:

startBtn = (Button)findViewById(R.id.StartButton);
stopBtn = (Button)findViewById(R.id.StopButton);
playBtn = (Button)findViewById(R.id.PlayButton);

سپس باید کدهای ذخیره سازی صدای ضبط شده در حافظه دستگاه را بنویسیم:

outputFile = Environment.getExternalStorageDirectory().
getAbsolutePath() + "/GsmRecord.3gp";;

در قسمت بعدی باید کدهایی را برای مقدار دهی به MediaRecorder بنویسیم:

myAudioRecorder = new MediaRecorder();
myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.MPEG_4);
myAudioRecorder.setOutputFile(outputFile);

مشاهده می کنید که با استفاده از کلاس MediaRecorder ، شی ای به نام MyAudioCapture تعریف کرده ایم.

در خط اول، سورس Audio ، در خط دوم فرمت خروجی Audio و در خط سوم روش انکود کردن Audio و در خط چهارم ذخیره ی Audio ی ضبط شده بر روی متغیر outputFile که در مرحله قبلی تعریف نمودیم انجام می شود.

stopBtn.setEnabled(true);
startBtn.setEnabled(false);

تعریف متدهایی برای شروع ضبط ، توقف ضبط و پخش صوت

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

ابتدا متدی با نام startRecording تعریف می کنیم. این متد، عملیات ضبط صدا را برای ما انجام می دهد.

public void startRecording(View view){
        try {
            MyAudioCapture.prepare();
            MyAudioCapture.start();
        }
        catch (IllegalStateException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        startBtn.setEnabled(false);
        stopBtn.setEnabled(true);
        Toast.makeText(getApplicationContext(), "Recording started",  Toast.LENGTH_LONG).show();

    }

با استفاده از متدهای MyAudioCapture.prepare و MyAudioCapture.start عملیات ضبط صدا انجام می شود.

حال که عملیات ضبط شروع شده باید تغییراتی در دکمه ها بدهیم.

پس با استفاده از کد startBtn.setEnabled که آرگومانش را false قرار می دهیم، دکمه Start را غیرفعال می کنیم.

همچنین با قرار دادن آرگومان true در stoptBtn.setEnabled دکمه ی STOP را فعال می کنیم.

در آخر با استفاده از Toast می توانیم پیغامی را مبنی بر شروع شدن عملیات ضبط به کاربر نشان دهیم.

دومین متد، متدی برای قطع عملیات ضبط صدا می باشد.

public void StartRecording (View view){
        MyAudioCapture.stop();
        MyAudioCapture.release();
        MyAudioCapture = null;
        stopBtn.setEnabled(false);
        playBtn.setEnabled(true);
        Toast.makeText(getApplicationContext(), "Audio recorded successfully", Toast.LENGTH_LONG).show();
    }

این متد برعکس متد StartRecording است.

با استفاده از MyAudioCapture.stop و MyAudioCapture.release عملیات قطع ضبط صدا انجام می شود. سپس برابر با null قرار داده می شود.

همچنین دکمه ی STOP غیر فعال، و دکمه ی PLAY فعال می شود.

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

متد Play نیز باید برای پخش کردن صدای ضبط شده، نوشته شود.

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

public void play(View view) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException
    {

        MediaPlayer myrecord = new MediaPlayer();
        myrecord.setDataSource(outputFile);
        myrecord.prepare();
        myrecord.start();
        Toast.makeText(getApplicationContext(), "Playing audio",  Toast.LENGTH_LONG).show();
    }

در خط اول از متد play، یک شی به نام myrecord از نوع کلاس MediaPlayer تعریف می شود.

در خط دوم از این متد، فایل outputFile که یک فایل خروجی است، به این شی (myrecord) داده می شود.

در خط های سوم و چهارم آماده سازی و پخش انجام می گیرید.

در خط پنجم، یک Toast جهت نشان دادن پیغامی مبنی بر پخش صدای ضبط شده (Playing audio) تعریف شده است.

برای آن که بتوانید صدا را ضبط کنید و همچنین به حافظه ی دستگاه دسترسی داشته باشید، لازم است دو دسترسی را در قسمت AndroidManifest.xml تعریف نمایید:

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

پس کد کلی AndroidManifest.xml به این صورت تعریف می شود:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gsm_developers.audiocapture_gsm">
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <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>

درباره Arash

طراح سایت و برنامه نویس

پیشنهاد ما به شما

آموزش برنامه نویسی اندروید با اندروید استودیو (بخش پنجاه و ششم: بررسی امکان وجود فایل در دایرکتوری معین )

2 دیدگاه

  1. سلام
    اینو چند بار نوشتم ولی اجرا نشد میشه کد کاملشو آخر پستت بذاری مثل دفعات قبل؟

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

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