«

»

Oct 27

הקלטת שמע, הפעלתו ובחירתו

הקלטת שמע, הפעלתו ובחירתו:

 
 

רקע תאורטי:

 

ה Sdk של אנדרואיד מכיל Framework לעבודה עם המדיה, עם החומרה של ההקלטה והמיקרופון. ה framework תומך בפורמטים שונים של אודיאו בשביל להקל על העבודה שלנו.

 

בשביל להקליט יש כמה אפשרויות:
    1. לקרוא לאפליקציה של ה Media של אנדרואיד להקלטה, לתת לה לעשות את העבודה של ההקלטה, ולקבל ממנה בחזרה במידע
    של ה intent את המידע של ההקלטה.
    2. לקרוא ב intent כללי ואז לבחור בין האפליקציה שתופסות את הבקשה הזו להקליט. זאת מכיוון שבחלק מהמכשירים אפליקציית ה
    Media לא קיימת או שונה, ואז נתקל בבעיה להפעיל אותה ב intent.
    3. לממש בעצמך את ההקלטה. אופציה זאת מאפשרת לך לערוך בעצמך את ההקלטה.

 

בשביל לבחור שמע שהקלטנו יש שתי אפשרויות:
    1. או להשתמש ב MediaStore שזאת הגלריה של אנדרואיד. לתת למשתמש לבחור ממנה את השמע ולקבל ממנה בחזרה במידע
    של ה intent את איזה קובץ בחרנו.
    2. לשלוח intent כללי לאפליקציות שבוחרות שמע ואז לבחור בין האפליקציות הללו.

 

(לא ניצור בעצמנו מערכת לבחירת קבצי שמע ממערכת הקבצים)

 
 

דוגמא והסבר להקלטה ובחירת שמע מהגלריה:

 

1.

הפעלת ה intent לגלריה לבחירת קובץ שמע:

שהמשתמש יבחר אפליקציה שיש לה סוג של שמע:

		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);  
		intent.setType("audio/*");  
		startActivityForResult(Intent.createChooser(intent, "Select music"), SELECT_SOUND);

 

להפעיל את ה mediaStore שמשם יבחר הקובץ.

שיטה זאת יותר יותר נכונה מהבחינה שבאופציה הראשונה יכולים להפתח אפליקציות, כמו ה total commander, ששם אפשר לבחור קבצים שהם לא רק שמע (ואז האפליקציה יכולה לעוף).

מצד שני במכשירים ישנים שאין בהם את ה mediaStore, האפליקציה שלנו תעוף:

Intent galIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galIntent, SELECT_SOUND);

 

הפעלת ה intent לתוכנת ההקלטה במכשיר:

loadAudio.setOnClickListener(new OnClickListener() {
@Override
	public void onClick(View v) {
//Sends an intent to start the recorder application
		Intent recordIntent = new Intent(
		MediaStore.Audio.Media.RECORD_SOUND_ACTION);
		startActivityForResult(recordIntent, RECORD_SOUND);
			}
		});

 

 2.
יצירת תוכנת הקלטה משלנו:

 

ראשית בשביל להקליט שמע יש קודם כל להכריז על ההרשאות המתאימות ב manifest שהם:
    בשביל להקליט:

    <uses-permission android:name=“android.permission.RECORD_AUDIO” />

    בשביל לשמור את קובץ השמע למערכת הקבצים:

    <uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE” />

 

בתוכנת ההקלטה לדוגמא שבניתי השתמשתי במחלקה RehearsalAudioRecorder שהיא קוד פתוח שראיתי שמשפר את ביצועי ההקלטה.

 

קביעת עוצמת השמע למקסימום:
		final AudioManager audio=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
		_originalVolume=audio.getStreamVolume(AudioManager.STREAM_MUSIC);
		final int maxVolumeForMediaSound=audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
		audio.setStreamVolume(AudioManager.STREAM_MUSIC,maxVolumeForMediaSound,AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

ביצוע ההקלטה ובחירת הקובץ _fileName שאליו נשמור את ההקלטה

			_recorder = new RehearsalAudioRecorder(RehearsalAudioRecorder.RECORDING_UNCOMPRESSED, 
					MediaRecorder.AudioSource.MIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, 
					AudioFormat.ENCODING_PCM_16BIT);
			_recorder.setOutputFile(_fileName);
			_recorder.prepare();
			_recorder.start();

ושנרצה לעצור את ההקלטה:

		_recorder.stop();
		_recorder.release();
		_recorder = null;

 

3.
הפעלת השמע שהקלטנו:
בין אם ממשנו את אפליקציית ה recording או אם לחצנו על כפתור ההקלטה ונפתחה תוכנת ההקלטה חיצונית,לאחר שהקלטנו סאונד ולחצנו אישור או שבחרנו קובץ שמע מרשימה ולחצנו אישור, נקבל את התשובה ב onActivityResult.

 

קבלת ה URI לקובץ שהוקלט:

_recordedSoundUri = data.getData();			  
if(_recordedSoundUri != null) {
	try {

יצירת ה mediaPlayer

	mediaPlayer = MediaPlayer.create(RecordingTestProjectActivity.this, _recordedSoundUri);

אי אפשר ליצור פעמיים mediaPlayer בלי reset.

	mediaPlayer.reset();

קביעת ה source של הסאונד מחדש

	mediaPlayer.setDataSource(RecordingTestProjectActivity.this, _recordedSoundUri);

חייבים לקרוא ל prepare לפני שכל ה controls יוכלו לתקשר עם ה mediaPlayer

	mediaPlayer.prepare();

יצירת ה mediaControler שהוא ה view להפעלת השמע:

	mediaController = new MediaController(RecordingTestProjectActivity.this);

קנפוג כל הפעולות של ה mediaController שיפעילו את ה mediaPlayer שיצרנו (שלו כבר קבענו את השמע שהוא עובל עליו)

mediaController.setMediaPlayer(new MediaPlayerControl() {
		public void start() {
			mediaPlayer.start();
		}
		public void pause() {
			mediaPlayer.pause();
		}
		public int getDuration() {
			return mediaPlayer.getDuration();
		}
		public int getCurrentPosition() {
			return mediaPlayer.getCurrentPosition();
		}
		public void seekTo(int i) {
			mediaPlayer.seekTo(i);
		}
		public boolean isPlaying() {
			return mediaPlayer.isPlaying();
		}
		public int getBufferPercentage() {
			return 0;
		}
		public boolean canPause() {
			return true;
		}
		public boolean canSeekBackward() {
			return true;
		}
		public boolean canSeekForward() {
			return true;
		}
	});

קביעת ה view שה mediaController יהיה מעליו, במקרה הזה, זה ה layout הבסיסי

	mediaController.setAnchorView(findViewById(R.id.main_view));

לאפשר את ה mediaController

	mediaController.setEnabled(true);

לקבוע להציג אותו ללא מגבלת זמן (ז.א שהוא לא יעלם אחרי 3 שניות)

	mediaController.show(0);

 
 

לינק להורדת הפרויקט לדוגמה שמשתמש ב intent ב של ה MediaStore

 

לינק להורדת הפרויקט לדוגמה במימוש עצמי

 

בהצלחה !

 

Leave a Reply

Your email address will not be published.

אתם יכולים להשתמש באפשרויות ותגי ה-HTMLהבאים: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>