המתנה בתור

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

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

Styled Media ReceiverDefault Media Receiver

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

פריט בתור המדיה מיוצג במסגרת Cast בתור מכונה של MediaQueueItem. כשאתם יוצרים פריט בתור של מדיה, אם אתם משתמשים בספריית נגן המדיה עם תוכן אדפטיבי, אתם יכולים להגדיר את זמן הטעינה מראש כדי שהנגן יוכל להתחיל לאגור בזיכרון את פריט המדיה שבתור לפני שהפריט שלפניו בתור מסיים לפעול. הגדרת המאפיין של ההפעלה האוטומטית של הפריט כ-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() – אם הפריט הבא נטען מראש, השיטה מחזירה את מזהה הפריט שנטען מראש.
  • השיטה getLoadingItemId() מחזירה את מזהה הפריט שעומד כרגע בעומס (אבל לא פעיל בתור) אצל המקבל.
  • השיטה getCurrentItemId() מחזירה את מזהה הפריט שהיה פעיל בתור (יכול להיות שהוא לא הופעל) בזמן שינוי סטטוס המדיה.
  • השיטה getQueueItems() (השיטה הוצאה משימוש, יש להשתמש ב-MediaQueue במקום זאת) – מחזירה את רשימת המופעים של MediaQueueItem כרשימה שלא ניתן לשנות אותה.

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

  • ה-method‏ getItemIds() מחזיר את הרשימה של כל מזהי הפריטים לפי הסדר.
  • השיטה 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 שבוחר את הפריט הבא), להסיר פריטים מהתור ולסדר מחדש את הפריטים בתור.