ضبط صدا در اندروید
آندروید دارای یک میکروفون داخلی است که از طریق آن می توان صوتی را دستگاه اندرویدی ضبط ، ذخیره یا پخش کرد. راه های زیادی برای انجام این کار وجود دارد، اما مرسوم ترین روش این است که از کلاس 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 دیدگاه