במסמך הזה נסביר את המושגים הבסיסיים שצריך להכיר לפני שמתחילים לעבוד עם Media Player.
שיעורי אודיו ווידאו
הכיתות הבאות מאפשרות להפעיל אודיו ווידאו במסגרת Android:
MediaPlayer
: הכיתה הזו היא ממשק ה-API הראשי להפעלת אודיו ווידאו.AudioManager
: המחלקה הזו מנהלת מקורות אודיו ופלט אודיו במכשיר.
הצהרות במניפסט
לפני שמתחילים לפתח את האפליקציה באמצעות MediaPlayer, צריך לוודא שבמניפסט מופיעות ההצהרות המתאימות שמאפשרות להשתמש בתכונות הקשורות.
הרשאת אינטרנט: אם אתם משתמשים ב-MediaPlayer כדי להעביר תוכן מבוסס-רשת בסטרימינג, האפליקציה שלכם צריכה לבקש גישה לרשת.
<uses-permission android:name="android.permission.INTERNET" />
הרשאת Wake Lock: אם באפליקציית הנגן צריך למנוע את העמעום של המסך או את מעבר המעבד למצב שינה, או אם משתמשים בשיטות
MediaPlayer.setScreenOnWhilePlaying(boolean)
אוMediaPlayer.setWakeMode(android.content.Context, int)
, צריך לבקש את ההרשאה הזו.<uses-permission android:name="android.permission.WAKE_LOCK" />
שימוש בכיתה MediaPlayer
הכיתה MediaPlayer
היא רכיב חיוני של מסגרת המדיה.
אובייקט מהקלאס הזה יכול לאחזר, לפענח ולהפעיל גם אודיו וגם וידאו עם הגדרה מינימלית. ב-MediaPlayer
יש תמיכה במספר מקורות מדיה, כולל:
- משאבים מקומיים
- מזהי URI פנימיים, כמו מזהה שאפשר לקבל מ-Content Resolver
- כתובות URL חיצוניות (סטרימינג)
רשימה של פורמטים של מדיה שנתמכים ב-Android מופיעה בדף פורמטים נתמכים של מדיה.
דוגמאות לעבודה עם מקורות אודיו
דוגמה להפעלת אודיו שזמין כמשאב גולמי מקומי (ששמור בספרייה res/raw/
של האפליקציה):
Kotlin
var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you
Java
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you
במקרה הזה, משאב 'גולמי' הוא קובץ שהמערכת לא מנסה לנתח בדרך מסוימת. עם זאת, התוכן של המשאב הזה לא צריך להיות אודיו גולמי. הקובץ צריך להיות קובץ מדיה מקודד ומפורמט כראוי באחד מהפורמטים הנתמכים.
כך אפשר להפעיל מ-URI שזמין באופן מקומי במערכת (למשל, קיבלתם אותו דרך Content Resolver):
Kotlin
val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(applicationContext, myUri)
prepare()
start()
}
Java
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
ההפעלה מכתובת URL מרוחקת באמצעות סטרימינג ב-HTTP נראית כך:
Kotlin
val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
setDataSource(url)
prepare() // might take long! (for buffering, etc)
start()
}
Java
String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
שימוש בהכנה אסינכרונית לשיפור הביצועים
כשמשתמשים ב-MediaPlayer
, חשוב לזכור את הביצועים. לדוגמה, יכול להיות שהפעלת הקריאה ל-prepare()
תימשך זמן רב, כי היא עשויה לכלול אחזור ופענוח של נתוני מדיה. לכן, כמו כל שיטה שעשויה להימשך זמן רב לביצוע, אף פעם אל תפעילו אותה משרשור ממשק המשתמש של האפליקציה. הפעולה הזו גורמת לממשק המשתמש להפסיק להגיב עד שהשיטה תחזיר תשובה. זוהי חוויית משתמש גרועה, ויכולה לגרום לשגיאה מסוג ANR (האפליקציה לא מגיבה).
כדי למנוע את ההשהיה של שרשור ממשק המשתמש, יוצרים שרשור אחר כדי להכין את MediaPlayer
ומודיעים לשרשור הראשי בסיום. המסגרת מספקת דרך נוחה לביצוע השיטה prepareAsync()
לביצוע המשימה הזו. השיטה הזו מתחילה להכין את המדיה ברקע ומחזירה מיד. כשהמדיה מוכנה, מתבצעת קריאה ל-method onPrepared()
של MediaPlayer.OnPreparedListener
, שהוגדרה דרך setOnPreparedListener()
.
מידע נוסף
Jetpack Media3 הוא הפתרון המומלץ להפעלת מדיה באפליקציה. מידע נוסף
בדפים האלה מפורטים נושאים שקשורים להקלטה, לאחסון ולהפעלה של אודיו ווידאו: