یه بار برای همیشه، فرانت‌اندو اصولی یاد بگیر! یه بار برای همیشه، فرانت‌اندو اصولی یاد بگیر!
🎯 ثبت نام

آموزش media API به منظور ضبط و پخش صدا

رسانه در اندروید - صدا

مقاله ی پیش رو روش استفاده از media API را به منظور ضبط صدا و پخش آن به شما آموزش می دهد.

فهرست محتوا

1. رسانه و صدا در اندروید

  • پخش صدا
  • آموزش استفاده از کلاس MediaRecorder
  • افزودن Media جدید به کتابخانه ی رسانه های اندروید

2. آموزش : پخش صدا با SoundPool

3. آموزش : ضبط صدا به وسیله ی کلاس MediaRecorder

رسانه و صدا در اندروید

پخش صدا

اندروید به منظور پخش صدا دو API اصلی ارائه می دهد. اولین آن ها کلاس SoundPool و دیگری کلاس MediaPlayer می باشد. کلاس SoundPool ویژه ی کلیپ های صوتی کم حجم بکار گرفته می شود. این کلاس قادر است صداها را تکرار کرده و همچنین چندین صدا را به طور همزمان پخش کند. فایل های صوتی که با SoundPool پخش می شوند نباید از مرز 1 مگابایت تجاوز کنند.
SoundPool فایل های صوتی را به طور ناهمگام نیز بارگذاری می کند. از رابط برنامه سازی کاربردی 8 به بعد اندروید، همچنین می توان با استفاده از OnLoadCompleteListener بررسی کرد آیا فرایند بارگذاری تکمیل شده یا خیر.
اندروید برای مقاصد مختلف از چندین audio stream (جریان صوتی) متفاوت پشتیبانی می کند. دکمه ی تنظیم صدای گوشی را می توان طوری تنظیم و پیکربندی کرد که audio stream معینی را کنترل کند، برای مثال حین یک تماس تلفنی دکمه ی تنظیم صدا به شما این امکان را می دهد که صدای تماس گیرنده را کم یا زیاد کنید. برای انتخاب دکمه ی تنظیم sound media stream (جریان رسانه صوتی) نوع audio را در اپلیکیشن خود انتخاب کنید.

1
2
context.setVolumeControlStream(AudioManager.STREAM_MUSIC);
 <button></button>
MediaPlayer بیشتر مناسب موسیقی ها و فیلم های به نسبت طولانی می باشد.

آموزش استفاده از کلاس MediaRecorder


کلاس android.media.MediaRecorder ویژه ی ضبط صدا و تصویر بکار گرفته می شود. به منظور استفاده از MediaRecorder باید دستگاه مبدا و قالب (فرمت) آن را مشخص کنید.

افزودن رسانه ی جدید به کتابخانه ی رسانه های اندروید


همچنین می توان رسانه ی جدید به media library اندروید افزود. با استفاده از intent می توان به برنامه های مربوط به رسانه دستگاه اطلاع داد که محتوای جدید موجود می باشد.

1
2
3
4
5
6
7
8
9
10
11
12
13
// add new file to your media library
ContentValues values = new ContentValues(4);
        long current = System.currentTimeMillis();
        values.put(MediaStore.Audio.Media.TITLE، "audio" + audiofile.getName());
        values.put(MediaStore.Audio.Media.DATE_ADDED، (int) (current / 1000));
        values.put(MediaStore.Audio.Media.MIME_TYPE، "audio/3gpp");
        values.put(MediaStore.Audio.Media.DATA، audiofile.getAbsolutePath());
        ContentResolver contentResolver = getContentResolver();
        Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Uri newUri = contentResolver.insert(base، values);
// Notifiy the media application on the device
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE، newUri));
                <button></button>

آموزش : پخش صدا با SoundPool

در این قسمت برنامه ی می نویسیم که به محض برخورد انگشت با صفحه نمایش شروع به پخش صدا می کند. پروژه ی جدیدی به نام "de.tahlildadeh.android.soundpool" ایجاد کرده، سپس به ساخت activity آن بپردازید (به نام PlaySound).
طرح کلی main.xml را به کد زیر تغییر دهید.

1
2
3
4
5
6
7
                <!--?xml version="1.0" encoding="utf-8" ?-->
 
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
                <textview android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="match_parent" android:text="Click on the screen to start playing">
    </textview>
</linearlayout>
                <button></button>

یک موسیقی یا صدایی که قصد پخش آن را دارید دانلود کنید. به عنوان مثال سایت Free Sound Effects دربردارنده ی بسیاری از نمونه های رایگان صدا و موسیقی است که شما می توانید به راحتی دانلود کنید.
فایل صوتی را در پوشه ی "res/raw" خود تحت اسم "sound1.ogg" جای گذاری کنید.
حال کدنویسی زیر را ویژه ی activity خود انجام کنید.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package de.vogella.android.soundpool;
import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class PlaySound extends Activity implements OnTouchListener {
  private SoundPool soundPool;
  private int soundID;
  boolean loaded = false;
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    View view = findViewById(R.id.textView1);
    view.setOnTouchListener(this);
    // Set the hardware buttons to control the music
    this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
    // Load the sound
    soundPool = new SoundPool(10، AudioManager.STREAM_MUSIC، 0);
    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
      @Override
      public void onLoadComplete(SoundPool soundPool، int sampleId،
                                 int status) {
        loaded = true;
      }
    });
    soundID = soundPool.load(this، R.raw.sound1، 1);
  }
  @Override
  public boolean onTouch(View v، MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
      // Getting the user sound settings
      AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
      float actualVolume = (float) audioManager
             .getStreamVolume(AudioManager.STREAM_MUSIC);
      float maxVolume = (float) audioManager
             .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
      float volume = actualVolume / maxVolume;
      // Is the sound loaded already?
      if (loaded) {
        soundPool.play(soundID، volume، volume، 1، 0، 1f);
        Log.e("Test"، "Played sound");
      }
    }
    return false;
  }
}
                <button></button>
اکنون اگر activity خود را با انگشت لمس کنید، فایل صوتی مورد نظر پخش شده و از تنظیمات فعلی درجه صدا استفاده می کند.

آموزش : ضبط صدا به وسیله ی کلاس MediaRecorder

برنامه ی کاربردی می سازیم که مجرد تماس انگشت با صفحه نمایش شروع به پخش شدن می کند. در مرحله ی اول پروژه ی به نام "de.vogella.android.media.soundrecording"به همراه activity ی به نام RecordSound وارد فضای کاری خود کنید.
به همراه activity ی به نام RecordSound ایجاد کنید.
اجازه ی نوشتن و ذخیره سازی اطلاعات در حافظه ی خارجی (sd) و ضبط دادهای صوتی را به فایل AndroidManifest.xml اضافه کنید.

1
2
3
4
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
  
                <button></button>
فایل main.xml را نیز به ترتیب زیر تغییر دهید.
1
2
3
4
5
6
7
8
9
<!--?xml version="1.0" encoding="utf-8" ?-->
 
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal">
                <button android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start Recording" android:onclick="startRecording"></button>
 
                <button android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop Recording" android:enabled="false" android:onclick="stopRecording"></button>
 
 </linearlayout>
                <button></button>
کلاس activity خود را به ترتیب زیر اصلاح کنید.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package de.vogella.android.media.soundrecording;
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class SoundRecordingActivity extends Activity {
  MediaRecorder recorder;
  File audiofile = null;
  private static final String TAG = "SoundRecordingActivity";
  private View startButton;
  private View stopButton;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    startButton = findViewById(R.id.start);
    stopButton = findViewById(R.id.stop);
  }
  public void startRecording(View view) throws IOException {
    startButton.setEnabled(false);
    stopButton.setEnabled(true);
    File sampleDir = Environment.getExternalStorageDirectory();
    try {
      audiofile = File.createTempFile("sound"، ".3gp"، sampleDir);
    } catch (IOException e) {
      Log.e(TAG، "sdcard access error");
      return;
    }
    recorder = new MediaRecorder();
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    recorder.setOutputFile(audiofile.getAbsolutePath());
    recorder.prepare();
    recorder.start();
  }
  public void stopRecording(View view) {
    startButton.setEnabled(true);
    stopButton.setEnabled(false);
    recorder.stop();
    recorder.release();
    addRecordingToMediaLibrary();
  }
  protected void addRecordingToMediaLibrary() {
    ContentValues values = new ContentValues(4);
    long current = System.currentTimeMillis();
    values.put(MediaStore.Audio.Media.TITLE، "audio" + audiofile.getName());
    values.put(MediaStore.Audio.Media.DATE_ADDED، (int) (current / 1000));
    values.put(MediaStore.Audio.Media.MIME_TYPE، "audio/3gpp");
    values.put(MediaStore.Audio.Media.DATA، audiofile.getAbsolutePath());
    ContentResolver contentResolver = getContentResolver();
    Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Uri newUri = contentResolver.insert(base، values);
    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE، newUri));
    Toast.makeText(this، "Added File " + newUri، Toast.LENGTH_LONG).show();
  }
}
  
                <button></button>

اکنون به محض استفاده از دکمه ی "Start Recording" خواهید دید که ضبط صدا امکان پذیرشده است. پس از زدن دکمه ی stop recording، فرایند ضبط صدا متوقف شده و فایل به media library شما افزوده خواهد شد.

1394/07/27 7488 4200
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...