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

یکشنبه 4 بهمن 1394

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

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

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

در مرحله ی بعد یک activity جدید بسازید.

در این مقاله از آخرین api موجود در Sdk استفاده شده است ولی باید api بالای 10 باشد:

بعد از ایجاد به صورت زیر خواهد بود:

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

<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"
   tools:context=".MainActivity" >
   <TextView
      	android:id="@+id/text1"
      	android:layout_width="fill_parent"
      	android:layout_height="wrap_content"
		android:text="شماره رکورد:"
      	android:textAppearance="?android:attr/textAppearanceMedium" android:layout_alignParentTop="true"
		android:layout_centerHorizontal="true"/>
   <ImageView
   		android:id="@+id/micImage"
      	android:layout_width="60dp"
      	android:layout_height="60dp"
      	android:layout_below="@+id/text1"
      	android:layout_centerHorizontal="true"
      	android:layout_marginTop="20dp"
      	android:src="@android:drawable/presence_audio_online" />
   <LinearLayout  android:layout_width="match_parent"
   		android:layout_height="wrap_content"
   		android:layout_marginTop="10dp"
   		android:layout_below="@+id/micImage"
   		android:id="@+id/linear1"
   		android:orientation="horizontal" android:gravity="right">

	   <Button
	      	android:id="@+id/start"
	      	android:layout_width="wrap_content"
	      	android:layout_height="wrap_content"
	      	android:text="شروع" android:singleLine="false"/>
	   <Button
	      	android:id="@+id/stop"
	      	android:layout_width="wrap_content"
	      	android:layout_height="wrap_content"
	      	android:layout_marginLeft="10dp"
	      	android:enabled="false"
	      	android:text="توقف" />
   </LinearLayout>
   <LinearLayout  android:layout_width="match_parent"
   		android:layout_height="wrap_content"
   		android:layout_marginTop="10dp"
   		android:layout_below="@+id/linear1"
   		android:id="@+id/linear2"
   		android:orientation="horizontal" android:gravity="right">
	   <Button
	      	android:id="@+id/play"
	      	android:layout_width="wrap_content"
	      	android:layout_height="wrap_content"
	      	android:enabled="false"
	      	android:text="شروع ضبط" />
	   <Button
	      	android:id="@+id/stopPlay"
	      	android:layout_width="wrap_content"
	      	android:layout_height="wrap_content"
	      	android:enabled="false"
	      	android:layout_marginLeft="10dp"
	      	android:text="توقف ضبط" />
	</LinearLayout>
</RelativeLayout>

از یک imageview استفاده می نماییم و عکس مورد نظر آن را داخل پوشه ی drawable قرار می دهیم.

برای ضبط صدا ما باید یک نمونه از کلاس mediarecorder ایجاد و برخی تنظیمات را برای آن انجام دهیم.

ما با استفاده از MediaRecorder.Audiosource.MIC تنظیم میکروفون را برای تنظیم صوتی و ضبط صدا

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

حالا بعد از تنظیم کردن source نوبت به format و encodeing کردن اطلاعات می باشد، برای توقف ضبط صدا دیگر از mediarecorder استفاده نمی شود و توصیه می شود که از متد release برای این کار انجام شود.

در این نمونه ما می خواهیم فقط صدای ضبط شده پخش شود بنابر این ما از mediaplayer استفاده می نماییم، که این دو متد یکی start و دیگری prepare که این دو متد به منظور پخش آهنگ ها مورد استفاده قرار می گیرند.

دو متد stop و release  هم برای توقف صداهای ضبط شده استفاده خواهد شد.

حالا خود کلاس جاوا به صورت زیر خواهد بود:

import java.io.IOException;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
   private MediaRecorder myRecorder;
   private MediaPlayer myPlayer;
   private String outputFile = null;
   private Button startBtn;
   private Button stopBtn;
   private Button playBtn;
   private Button stopPlayBtn;
   private TextView text;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      
      text = (TextView) findViewById(R.id.text1);
      // store it to sd card
      outputFile = Environment.getExternalStorageDirectory().
    		  getAbsolutePath() + "/javacodegeeksRecording.3gpp";

      myRecorder = new MediaRecorder();
      myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
      myRecorder.setOutputFile(outputFile);
      
      startBtn = (Button)findViewById(R.id.start);
      startBtn.setOnClickListener(new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			start(v);
		}
      });
      
      stopBtn = (Button)findViewById(R.id.stop);
      stopBtn.setOnClickListener(new OnClickListener() {
  		
  		@Override
  		public void onClick(View v) {
  			// TODO Auto-generated method stub
  			stop(v);
  		}
      });
      
      playBtn = (Button)findViewById(R.id.play);
      playBtn.setOnClickListener(new OnClickListener() {
  		
  		@Override
  		public void onClick(View v) {
  			// TODO Auto-generated method stub
				play(v);	
  		}
      });
      
      stopPlayBtn = (Button)findViewById(R.id.stopPlay);
      stopPlayBtn.setOnClickListener(new OnClickListener() {
  		
  		@Override
  		public void onClick(View v) {
  			// TODO Auto-generated method stub
  			stopPlay(v);
  		}
      });
   }
   public void start(View view){
	   try {
          myRecorder.prepare();
          myRecorder.start();
       } catch (IllegalStateException e) {
          // start:it is called before prepare()
    	  // prepare: it is called after start() or before setOutputFormat() 
          e.printStackTrace();
       } catch (IOException e) {
           // prepare() fails
           e.printStackTrace();
        }
	   
       text.setText("Recording Point: Recording");
       startBtn.setEnabled(false);
       stopBtn.setEnabled(true);
       
       Toast.makeText(getApplicationContext(), "Start recording...", 
    		   Toast.LENGTH_SHORT).show();
   }
   public void stop(View view){
	   try {
	      myRecorder.stop();
	      myRecorder.release();
	      myRecorder  = null;
	      
	      stopBtn.setEnabled(false);
	      playBtn.setEnabled(true);
	      text.setText("Recording Point: Stop recording");
	      
	      Toast.makeText(getApplicationContext(), "Stop recording...",
	    		  Toast.LENGTH_SHORT).show();
	   } catch (IllegalStateException e) {
			//  it is called before start()
			e.printStackTrace();
	   } catch (RuntimeException e) {
			// no valid audio/video data has been received
			e.printStackTrace();
	   }
   }
   public void play(View view) {
	   try{
		   myPlayer = new MediaPlayer();
		   myPlayer.setDataSource(outputFile);
		   myPlayer.prepare();
		   myPlayer.start();
		   
		   playBtn.setEnabled(false);
		   stopPlayBtn.setEnabled(true);
		   text.setText("Recording Point: Playing");
		   
		   Toast.makeText(getApplicationContext(), "شروع",
				   Toast.LENGTH_SHORT).show();
	   } catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
   }
   public void stopPlay(View view) {
	   try {
	       if (myPlayer != null) {
	    	   myPlayer.stop();
	           myPlayer.release();
	           myPlayer = null;
	           playBtn.setEnabled(true);
	           stopPlayBtn.setEnabled(false);
	           text.setText("Recording Point: Stop playing");
	           
	           Toast.makeText(getApplicationContext(), "توقف",
					   Toast.LENGTH_SHORT).show();
	       }
	   } catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
   }
}

حالا داخل فایل Androidmanifest هم باید مجوز دسترسی استفاده از حافظه و ضبط صدا را قرار دهیم:

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

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

موقع اجرا اگر کارهای بالا درست انجام داده باشید اسم گوشی نمایش داده می شود و اجرا بر روی گوشی به صورت زیر خواهد بود:

زمانی که ضبط را بزنیم به صورت زیر خواهد بود:

زمانی که توقف ضبط صدا زده شود

زمانی که یک صدایی ضبط شده باشد و بخواهید آن را پخش نمایید:

زمانی که صدای ضبط شده را می خواهید متوقف نمایید:

 

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید