בפוסט זה נציג את פעולת ה-MediaPlayer ונבנה נגן אודיו בסיסי. ה-MediaPlayer הוא class הכולל גם אפשרות טיפול בוידאו. ראה קישור לאתר המפתחים של אנדרואיד.
הנגן מנגן שיר אחד בלבד, של הזמר ריי ווטסון. שם השיר: All My Desires. אני מודה שהכרתי אותו רק בעקבות חיפושי אחרי קבצי אודיו חופשיים להורדה חינם ובאופן חוקי.
הפורמט של השיר הוא mp3. גם midi, pcm ו -ogg vorbis נתמכים.
את הקובץ allmydesire.mp3 יש לשמור תחת res/raw.
הנגן שלנו יכיל כפתור יחיד להפעלה והפסקת ההשמעה. הוא כולל תצוגה של אורך השיר. הוא יזהה את סיום השיר וידפיס הודעה על המסך.
הוספתי לתצוגה גם נתונים על השיר ותמונה של הזמר. התצוגה של הנגן נראית כך:
מעבר לשמירת קובץ המוסיקה תחת /res/raw ושמירת התמונה תחת res/draw, הקבצים שבהם נתעניין הם קובץ ה-layout ואובייקט הג'אווה היחיד.
ב-layout אין שום חידוש. מופיעים שם 3 סוגים של אלמנטים: Button, שלושה TextView ו-ImageView. לא אציג את הקובץ כאן הפעם. הוא נמצא כמובן בחבילת הקבצים של הפרויקט הניתנת להורדה בהקלקה על הקישור.
שים לב, הקבצים הפעם בגודל 12MB, בגלל קבצי ה-mp3.
תוכן הקובץ הכולל את ה-class היחידי בפרויקט מוצג להלן.
- public class myAudioMediaPlayer extends Activity {
- MediaPlayer mp;
- Button playButton;
- Button stopButton;
- Button setMessageButton;
- Button clearMessageButton;
- TextView textBox;
- TextView textBox2;
- TextView textBox3;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- playButton = (Button)findViewById(R.id.play_button);
- textBox = (TextView)findViewById(R.id.text_box);
- textBox2 = (TextView)findViewById(R.id.text_box2);
- textBox3 = (TextView)findViewById(R.id.text_box3);
- mp = MediaPlayer.create(this, R.raw.allmydesire);
- String min = String.valueOf((mp.getDuration()/1000)/60);
- String sec = String.valueOf((mp.getDuration()/1000)%60);
- textBox2.setText( " All My Desire :"+"שם השיר");
- textBox3.setText( " Ray Watson :"+"שם המבצע");
- if(10> (mp.getDuration()/1000)%60)
- textBox.setText(min +":0"+sec + " :"+"משך השיר");
- else
- textBox.setText(min +":"+sec + " :"+"משך השיר");
- mp.setOnCompletionListener(new
- MediaPlayer.OnCompletionListener() {
- public void onCompletion(MediaPlayer mp)
- {
- mp.stop();
- textBox.setText("Song is Over. You can start again");
- playButton.setText("נגן");
- createMediaPlayerHelper();
- }
- });
- playButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- if(mp.isPlaying()){
- mp.pause();
- playButton.setText("נגן");
- }
- else{
- mp.start();
- playButton.setText("הפסק");
- }
- }
- });
- }
- private void createMediaPlayerHelper(){
- mp = MediaPlayer.create(this, R.raw.allmydesire);
- }
- }
הסבר לinCreate :
חלק 1:
עד שורה 23, אלה בעיקר האיתחולים מהסוג הרגיל, של אלמנטי ה- UI.
חלק 2: יצירת האובייקט של ה- MediaPlayer עם (create(Context context, int resid, כשה-id לקוח מה-class R.java.
השורות 2 ו 3, מחשבות את אורך השיר בדקות ושניות על סמך המתודה getDuration.
- mp = MediaPlayer.create(this, R.raw.allmydesire)
- String min = String.valueOf((mp.getDuration()/1000)/60)
- String sec = String.valueOf((mp.getDuration()/1000)%60)
- textBox2.setText( " All My Desire :"+"שם השיר");
- textBox3.setText( " Ray Watson :"+"שם המבצע");
- if(10> (mp.getDuration()/1000)%60)
- textBox.setText(min +":0"+sec + " :"+"משך השיר");
- else
- textBox.setText(min +":"+sec + " :"+"משך השיר");
חלק 4: callback שיופעל עם סיום השיר. שימוש במתודה setOnCompletionListener לרגיסטרציה של ה-callback. שהשיר נגמר עוצרים את הנגן (שורה 5), מדפיים הודעה ל-UI (שורה 6), הופכים את הכותרת שעל הכפתור מ"הפסק" ל"נגן", קוראים למתודת השירות (שורה 8), שיוצרת MediaPlayer מחדש. (הערה -יתכן שמספיק לעשות prepare - לבדוק)
- mp.setOnCompletionListener(new
- MediaPlayer.OnCompletionListener() {
- public void onCompletion(MediaPlayer mp)
- {
- mp.stop();
- textBox.setText("Song is Over. You can start again");
- playButton.setText("נגן");
- createMediaPlayerHelper();
- }
- });
חלק 5: יצירת callback עבור כפתור השליטה בנגן.
עם הלחיצה על הכפתור מפעילים את המתודה pause (שורה 4) או start (שורה 8), לפי התוצאה של המתודה isPlaying- שורה 3. באותה ההזדמנות הופכים את הכיתוב על הכפתור מ-"נגן" ל- " הפסק" ולהפך (שורות 5 ו-9).
- playButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- if(mp.isPlaying()){
- mp.pause();
- playButton.setText("נגן");
- }
- else{
- mp.start();
- playButton.setText("הפסק");
- }
- }
- });
בהחלט קצר ופשוט. עוד נחזור לתרגילים מורכבים יותר של ה-MediaPlayer.
היי רונן,
השבמחקהאם ניתן לעשות איזשהו עורך מדיה כדי לאפשר לחתוך שירים או וידאו בצורה קלה ? או אם יש לך הצעה ?
תודה
תחפש שיטות שנותנות להעתיק ל-buffer מנק' מסויימת לנק' אחרת בקובץ ה-audio, אני יודע שיש את זה לקבצים רגילים של טקסט, אז בטוח שיש את זה לקבצי audio.
השבמחקברגע שיש לך מקטע מסויים בחוצץ, אתה יכול לשחק איתו איך שבא לך, כמו למשל ליצור כמה חוצצים ולבצע עריכה כמו שרצית...
היי,
השבמחקנושא מעניין יכול להיות השימוש במחלקות MediaPlayer, MediaPlayerControl ו MediaController ליצירת נגן מדיה סטנדרטי, ולהבין את מערכת היחסים בניהם.
שדרוג של זה יכול להיות כמובן הזרמת מדיה מהרשת (תוך כדי הורדת הקובץ), הצגת וידאו, והפעלת הנגן בservice על מנת לאפשר נגינה ברקע.
מאד מאד נהנתי מההסברים המפרטים "בעברית"!!!
השבמחק