排程

Cast 架構提供佇列類別,支援建立 MediaQueueItem 執行個體清單。這些執行個體可透過 MediaInfo 執行個體 (例如影片或音訊串流) 建構,以便在接收器上依序播放。這個內容項目佇列可以編輯、重新排序、更新等等。

接收器 SDK 負責維護佇列,只要佇列中至少有一個有效項目 (正在播放或暫停),就會回應佇列中的作業。傳送者可以加入工作階段,並將項目加入佇列。接收方會保留佇列項目的工作階段,直到最後一個項目完成播放、傳送者停止播放並終止工作階段,或是傳送者在接收器載入新佇列為止。根據預設,接收器不會保留任何關於終止佇列的資訊。待佇列中的最後一個項目完成後,媒體工作階段就會結束,佇列也會消失。

建立及載入媒體佇列項目

Cast 架構中會將媒體佇列項目表示為 MediaQueueItem 執行個體。在建立媒體佇列項目時,如果您將 Media Player 程式庫與自動調整內容搭配使用,可以設定預先載入時間,這樣一來,播放器就能在佇列中的項目播放完畢之前,開始緩衝處理媒體佇列項目。如果將該項目的自動播放屬性設為 true,接收器即可自動播放。舉例來說,您可以使用建構工具模式來建立媒體佇列項目,如下所示:

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();

使用適當的 RemoteMediaClientqueueLoad 方法,在佇列中載入媒體佇列項目的陣列。

接收媒體佇列狀態更新

接收器載入媒體佇列項目時,會為該項目指派專屬 ID,該項目在工作階段期間 (和佇列的生命週期) 期間會持續存在。應用程式可根據目前載入的項目 (可能並未播放)、載入或預先載入項目掌握佇列狀態。MediaStatus 類別提供以下狀態資訊:

  • getPreloadedItemId() 方法 - 如果已預先載入下一個項目,則會傳回預先載入的項目 ID。
  • getLoadingItemId() 方法 - 傳回目前在接收器載入 (但在佇列中沒有啟用的項目) 的項目 ID。
  • getCurrentItemId() 方法 - 傳回在媒體狀態變更時,佇列中有效項目的項目 ID (可能不會播放)。
  • getQueueItems() (已淘汰,請改用 MediaQueue) 方法 - 以無法修改的清單形式傳回 MediaQueueItem 例項清單。

應用程式也可以使用 MediaQueue 類別取得項目清單。類別是媒體佇列的稀疏資料模型。系統會將項目 ID 清單保留在佇列中,而 ID 會自動與接收器保持同步。MediaQueue 不會保留所有 MediaQueueItem,因為在佇列過長時,會佔用過多記憶體。而會改為依需求擷取項目,並保留最近存取項目的 LruCache。您可以使用下列方法存取媒體佇列:

  • getItemIds() 方法 - 依序傳回所有項目 ID 清單。
  • getItemAtIndex() 方法 - 傳回指定索引的快取項目。如未快取該項目,MediaQueue 會傳回 null 和時間表來擷取該項目。擷取項目時,系統會呼叫 MediaQueue.Callback#itemsUpdatedAtIndexes(),並再次呼叫相同 ID 的 getItemAtIndex(),將傳回商品。
  • 當使用者將佇列 UI 捲動至頂端或底部,且應用程式想要從雲端擷取更多項目時,系統會使用 fetchMoteItemsRelativeToIndex()

使用這些方法搭配其他媒體狀態方法,通知應用程式佇列狀態和佇列中的項目。除了來自接收器的媒體狀態更新外,應用程式也可以透過實作 RemoteMediaClient.CallbackMediaQueue.Callback,監聽佇列的變更。

此外,Cast SDK 提供兩種公用程式類別,可用來建立要排入佇列的 UI。

舉例來說,如要使用 MediaQueueRecyclerViewAdapter 建立 RecyclerView

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 演算法來選取下一個項目)、移除佇列中的項目,以及重新排序佇列中的項目。