مشخصات مقاله
آموزش 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> |
آموزش استفاده از کلاس 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> |
آموزش : ضبط صدا به وسیله ی کلاس 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> |
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> |
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 شما افزوده خواهد شد.