תחילת העבודה עם Media Player

במאמר הזה מוסברים המושגים הבסיסיים שכדאי להכיר לפני שמתחילים לעבוד עם 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(), כי היא עשויה לכלול אחזור ופענוח של נתוני מדיה. לכן, כמו כל שיטה שעלולה לקחת הרבה זמן לביצוע, אסור לקרוא לה משרשור UI של האפליקציה. פעולה כזו גורמת לממשק המשתמש להפסיק להגיב עד שהשיטה מחזירה ערך, וזה פוגע בחוויית המשתמש ועלול לגרום לשגיאת ANR (האפליקציה לא מגיבה).

כדי להימנע מקיפאון של שרשור ה-UI, צריך ליצור שרשור נוסף כדי להכין את MediaPlayer ולהודיע לשרשור הראשי כשההכנה מסתיימת. המסגרת מספקת דרך נוחה להשלמת השיטה prepareAsync() לביצוע המשימה הזו. בשיטה הזו, הכנת המדיה מתחילה ברקע והיא מוחזרת באופן מיידי. כשמסיימים להכין את המדיה, מתבצעת קריאה ל-method onPrepared() של MediaPlayer.OnPreparedListener, שמוגדר דרך setOnPreparedListener().

מידע נוסף

‫Jetpack Media3 הוא הפתרון המומלץ להפעלת מדיה באפליקציה. מידע נוסף

בדפים האלה מפורטים נושאים שקשורים להקלטה, לאחסון ולהפעלה של אודיו וסרטונים: