اندروید دارای یک میکروفون داخلی است که از طریق آن می توانید صدا را ضبط کرده و آن را ذخیره کنید یا آن را در گوشی خود پخش کنید. راه های زیادی برای انجام این کار وجود دارد اما رایج ترین راه برای ضبط صدا از طریق کلاس MediaRecorder می باشد.
کلاس MediaRecorder برای ضبط صدا یا تصویر در اندروید ارائه شده است. به این ترتیب برای استفاده از کلاس MediaRecorder، ابتدا یک نمونه از کلاس MediaRecorder می بایست ایجاد کنید. به شکل زیر :
MediaRecorder myAudioRecorder = new MediaRecorder();
حالا شما باید منبع ضبط صدا, فرمت و نوع رمزنگاری فایل تولید شده را مشخص کنید. به شکلی که در پایین می بینید :
myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); myAudioRecorder.setOutputFile(outputFile);
پس از مشخص کردن منبع و فرمت و نوع رمزنگاری فایل خروجی آن، میتوانیم دو متد اصلی را فراخوانی کرده و شروع به ضبط صدا کنیم.
myAudioRecorder.prepare(); myAudioRecorder.start();
جدای از این متدها، متدهای دیگری نیز در کلاس MediaRecorder فهرست شدهاند که به شما امکان کنترل بیشتر بر ضبط صدا و تصویر را میدهند.
متد و توضیحات آن | ردیف |
setAudioSource()
با استفاده از این متد می توانید منبعی که بایستی به بوسیله آن ضبط انجام شود را مشخص کنید. |
1 |
setVideoSource()
با استفاده از این متد می توانید منبعی که تصویری بایستی به بوسیله آن ضبط شود را مشخص کنید. |
2 |
setOutputFormat() این متد فرمت صوتی را مشخص می کند که صدا در آن ذخیره شود. |
3 |
setAudioEncoder() این متد رمزگذار صوتی مورد استفاده را مشخص می کند. |
4 |
setOutputFile()
این روش مسیر فایلی را که قرار است صدای ضبط شده در آن ذخیره شود، مشخص می کند. |
5 |
stop()
این متد تمامی پردازش های ضبط را متوقف می کند. |
6 |
release()
این متد باید زمانی فراخوانی شود که به نمونه ضبط کننده نیاز باشد. |
7 |
مثال اپلیکیشن ضبط صدا
این مثال کلاس MediaRecorder را برای ضبط صدا و سپس کلاس MediaPlayer را برای پخش آن فایل صوتی ارائه می دهد. برای آزمایش با این مثال، باید آن را روی یک دستگاه واقعی اجرا کنید.
توضیحات | مرحله |
ابتدا با استفاده از محیط توسعه اندروید استودیو یک پروژه با پکیج دلخواه ایجاد کنید. | 1 |
فایل MainActivity.java را بر اساس نمونه کد هایی که در پایین آوردیم تغییر بدهید. | 2 |
فایل activity_main.xml را بر اساس نمونه کد های xmlی که در پایین آورده ایم تغییر بدهید تا ویو ها اضافه شوند. | 3 |
فایل AndroidManifest.xml را بررسی کنید و مجوز های مورد نیاز را اضافه کنید. | 4 |
یک تلفن واقعی را به اندروید استودیو متصل کنید و تا بتوانید اپ را روی آن نصب و اجرا کنید و نتیجه را بررسی کنید. | 5 |
نمونه کد های فایل MainActivity.java
package com.foray.articlelib; import android.annotation.SuppressLint; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.os.Build; import android.os.Environment; import android.os.Bundle; 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; import android.content.pm.PackageManager; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; public class MainActivity extends AppCompatActivity { Button buttonStart, buttonStop, buttonPlayLastRecordAudio, buttonStopPlayingRecording; String AudioSavePathInDevice = null; MediaRecorder mediaRecorder; Random random; String RandomAudioFileName = "ABCDEFGHIJKLMNOP"; public static final int RequestPermissionCode = 1; MediaPlayer mediaPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonStart = (Button) findViewById(R.id.button); buttonStop = (Button) findViewById(R.id.button2); buttonPlayLastRecordAudio = (Button) findViewById(R.id.button3); buttonStopPlayingRecording = (Button) findViewById(R.id.button4); buttonStop.setEnabled(false); buttonPlayLastRecordAudio.setEnabled(false); buttonStopPlayingRecording.setEnabled(false); random = new Random(); buttonStart.setOnClickListener(view -> { if (checkPermission()) { AudioSavePathInDevice = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + CreateRandomAudioFileName(5) + "AudioRecording.3gp"; MediaRecorderReady(); try { mediaRecorder.prepare(); mediaRecorder.start(); } catch (IllegalStateException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } buttonStart.setEnabled(false); buttonStop.setEnabled(true); Toast.makeText(MainActivity.this, "ضبط شروع شد", Toast.LENGTH_LONG).show(); } else { requestPermission(); } }); buttonStop.setOnClickListener(view -> { mediaRecorder.stop(); buttonStop.setEnabled(false); buttonPlayLastRecordAudio.setEnabled(true); buttonStart.setEnabled(true); buttonStopPlayingRecording.setEnabled(false); Toast.makeText(MainActivity.this, "ضبط کامل شد", Toast.LENGTH_LONG).show(); }); buttonPlayLastRecordAudio.setOnClickListener(view -> { buttonStop.setEnabled(false); buttonStart.setEnabled(false); buttonStopPlayingRecording.setEnabled(true); mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(AudioSavePathInDevice); mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer.start(); Toast.makeText(MainActivity.this, "در حال پخش", Toast.LENGTH_LONG).show(); }); buttonStopPlayingRecording.setOnClickListener(view -> { buttonStop.setEnabled(false); buttonStart.setEnabled(true); buttonStopPlayingRecording.setEnabled(false); buttonPlayLastRecordAudio.setEnabled(true); if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); MediaRecorderReady(); } }); } @SuppressLint("WrongConstant") public void MediaRecorderReady() { mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); mediaRecorder.setOutputFile(AudioSavePathInDevice); } public String CreateRandomAudioFileName(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() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 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, "مجوز داده شد", Toast.LENGTH_LONG).show(); } else { Toast.makeText(MainActivity.this, "مجوز رد شد", Toast.LENGTH_LONG).show(); } } } } 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; } }
نمونه کد های فایل activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="32sp" android:gravity="center" android:textStyle="bold" android:textColor="@color/black" android:text="7cloner.com"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageView" android:layout_below="@id/title" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:src="@drawable/abc"/> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/imageView" android:layout_alignParentLeft="true" android:layout_marginTop="37dp" android:text="ضبط" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/button" android:layout_centerHorizontal="true" android:text="توقف" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/button2" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:text="پخش" /> <Button android:id="@+id/button4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/button2" android:layout_centerHorizontal="true" android:layout_marginTop="10dp" android:text="توقف و پخش " /> </RelativeLayout>
نمونه کد های فایل AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.foray.articlelib"> <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="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.ArticleLib"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>