המתנה בתור

‫Cast framework מספק מחלקות של תורים שתומכות ביצירת רשימות של מופעים של MediaQueueItem, שאפשר ליצור ממופעים של MediaInfo כמו סרטונים או סטרימינג של אודיו, כדי להפעיל אותם ברצף במקלט. אפשר לערוך, לסדר מחדש, לעדכן וכו' את התור הזה של פריטי תוכן.

‫Receiver SDK מתחזק את התור ומגיב לפעולות בתור כל עוד יש בתור לפחות פריט אחד פעיל (בהפעלה או בהשהיה). השולחים יכולים להצטרף לסשן ולהוסיף פריטים לתור. המכשיר המקבל שומר על סשן של פריטים בתור עד שההפעלה של הפריט האחרון מסתיימת, או עד שהמכשיר השולח מפסיק את ההפעלה ומסיים את הסשן, או עד שהמכשיר השולח טוען תור חדש במכשיר המקבל. כברירת מחדל, המקבל לא שומר מידע על תורים שהסתיימו. אחרי שהפריט האחרון בתור מסתיים, סשן המדיה מסתיים והתור נעלם.

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

פריט בתור להפעלת מדיה מיוצג ב-Cast Framework כמופע של MediaQueueItem. כשיוצרים פריט בתור להפעלת מדיה, אם משתמשים בספריית נגן המדיה עם תוכן דינמי, אפשר להגדיר את זמן הטעינה מראש כדי שהנגן יוכל להתחיל לשמור בזיכרון את הפריט בתור להפעלת מדיה לפני שהפריט שלפניו בתור יסיים את ההפעלה. הגדרת המאפיין autoplay של הפריט כ-true מאפשרת למקלט להפעיל אותו באופן אוטומטי. לדוגמה, אפשר להשתמש בתבנית builder כדי ליצור את הפריט בתור המדיה באופן הבא:

Kotlin
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo)
    .setAutoplay(true)
    .setPreloadTime(20.0)
    .build()
Java
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo)
  .setAutoplay(true)
  .setPreloadTime(20)
  .build();

טוענים מערך של פריטים בתור להפעלת מדיה בתור באמצעות ה-method המתאים‏ queueLoad של RemoteMediaClient.

קבלת עדכוני סטטוס של תור המדיה

כשהמקלט טוען פריט בתור להפעלת מדיה, הוא מקצה לפריט מזהה ייחודי שנשמר למשך משך ההפעלה (ולמשך משך התור). האפליקציה יכולה לדעת מה הסטטוס של התור, כלומר איזה פריט נטען כרגע (יכול להיות שהוא לא מושמע), נטען או נטען מראש. המחלקה MediaStatus מספקת את פרטי הסטטוס הבאים:

  • getPreloadedItemId() method – אם הפריט הבא נטען מראש, הפונקציה מחזירה את מזהה הפריט שנטען מראש.
  • getLoadingItemId() method - Returns the item ID of the item that is currently loading (but isn't active in the queue) on the receiver.
  • getCurrentItemId() method – מחזיר את מזהה הפריט של הפריט שהיה פעיל בתור (יכול להיות שהוא לא מושמע) בזמן שחל שינוי בסטטוס המדיה.
  • getQueueItems() ‫(הוצא משימוש, צריך להשתמש ב-MediaQueue במקום) method – מחזיר את רשימת המופעים של MediaQueueItem כרשימה שלא ניתן לשנות.

האפליקציה יכולה גם לקבל את רשימת הפריטים באמצעות המחלקה MediaQueue. הסיווג הוא מודל נתונים דליל של תור המדיה. הוא שומר את רשימת מזהי הפריטים בתור, והיא מסתנכרנת אוטומטית עם המקלט. MediaQueue לא שומר את כל MediaQueueItem כי זה יתפוס יותר מדי זיכרון כשהתור יהיה ארוך מאוד. במקום זאת, הוא מאחזר את הפריטים לפי דרישה ושומר LruCache של פריטים שהייתה אליהם גישה לאחרונה. אפשר להשתמש בשיטות האלה כדי לגשת לתור המדיה:

  • getItemIds() method – מחזיר את רשימת כל מזהי הפריטים לפי הסדר.
  • השיטה getItemAtIndex() מחזירה את הפריט שנשמר במטמון באינדקס נתון. אם הפריט לא נמצא במטמון, ‫MediaQueue יחזיר null ויתזמן שליפה של הפריט. כשמאחזרים את הפריט, מופעלת הפונקציה MediaQueue.Callback#itemsUpdatedAtIndexes(), ואם מפעילים שוב את הפונקציה getItemAtIndex() עם אותו מזהה, הפריט יוחזר.
  • השיטה fetchMoteItemsRelativeToIndex() משמשת כשהמשתמש גולל את ממשק המשתמש של התור לראש או לתחתית, והאפליקציה רוצה לאחזר עוד פריטים מהענן.

כדאי להשתמש בשיטות האלה יחד עם שיטות אחרות לקבלת סטטוס המדיה, כדי שהאפליקציה תדע מה הסטטוס של התור ושל הפריטים שבו. בנוסף לעדכוני סטטוס של מדיה מהמקלט, האפליקציה יכולה לעקוב אחרי שינויים בתור על ידי הטמעה של RemoteMediaClient.Callback ושל MediaQueue.Callback.

בנוסף, Cast SDK מספק שני מחלקות כלי עזר ליצירת ממשק משתמש להוספה לתור.

לדוגמה, כדי ליצור RecyclerView באמצעות MediaQueueRecyclerViewAdapter:

Kotlin
class MyRecyclerViewAdapter(mediaQueue: MediaQueue?) :
    MediaQueueRecyclerViewAdapter<MyViewHolder?>(mediaQueue) {
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val item = getItem(position)

        // Update the view using `item`.
        ...
    }
}

class MyViewHolder : RecyclerView.ViewHolder {
    // Implement your own ViewHolder.
    ...
}

fun someMethod() {
    val adapter = MyRecyclerViewAdapter(
        mCastSession.remoteMediaClient.getMediaQueue())
    val recyclerView =
        activity.findViewById(R.id.my_recycler_view_id) as RecyclerView
    recyclerView.adapter = adapter
}
Java
public class MyRecyclerViewAdapter extends MediaQueueRecyclerViewAdapter<MyViewHolder> {
    public MyRecyclerViewAdapter(MediaQueue mediaQueue) {
        super(mediaQueue);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
      MediaQueueItem item = getItem(position);

      // Update the view using `item`.
      ...
    }
}

public class MyViewHolder implements RecyclerView.ViewHolder {
  // Implement your own ViewHolder.
  ...
}

public void someMethod() {
    RecyclerView.Adapter adapter = new MyRecyclerViewAdapter(
        mCastSession.getRemoteMediaClient().getMediaQueue());
    RecyclerView recyclerView =
        (RecyclerView) getActivity().findViewById(R.id.my_recycler_view_id);
    recyclerView.setAdapter(adapter);
}

עריכת התור

כדי לבצע פעולות על הפריטים בתור, משתמשים בשיטות של התור במחלקה RemoteMediaClient. הפונקציות האלה מאפשרות לטעון מערך של פריטים לתור חדש, להוסיף פריטים לתור קיים, לעדכן את המאפיינים של פריטים בתור, להעביר פריט קדימה או אחורה בתור, להגדיר את המאפיינים של התור עצמו (לדוגמה, לשנות את repeatMode האלגוריתם שבוחר את הפריט הבא), להסיר פריטים מהתור ולשנות את הסדר של הפריטים בתור.