Cast 架構提供佇列類別,支援建立 MediaQueueItem 執行個體清單,這些清單可由 MediaInfo 執行個體 (例如影片或音訊串流) 建構,以便在接收端依序播放。您可以編輯、重新排序、更新這個內容項目佇列。
只要佇列中至少有一個項目目前處於啟用狀態 (播放或暫停),接收端 SDK 就會維護佇列,並回應佇列上的操作。傳送者可以加入工作階段,並將項目新增至待播清單。接收端會維護佇列項目的工作階段,直到最後一個項目播放完畢、傳送端停止播放並終止工作階段,或傳送端在接收端載入新佇列為止。根據預設,接收器不會保留任何已終止佇列的相關資訊。待播清單中的最後一個項目播放完畢後,媒體工作階段就會結束,待播清單也會消失。
建立及載入媒體佇列項目
在 Cast 架構中,媒體佇列項目會以 MediaQueueItem 執行個體表示。建立媒體佇列項目時,如果您使用媒體播放器程式庫搭配自動調整內容,可以設定預先載入時間,讓播放器在佇列中前一個項目播放完畢前,開始緩衝處理媒體佇列項目。將項目的 autoplay 屬性設為 true,接收端就會自動播放。舉例來說,您可以使用建構工具模式建立媒體佇列項目,如下所示:
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo) .setAutoplay(true) .setPreloadTime(20.0) .build()
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo) .setAutoplay(true) .setPreloadTime(20) .build();
使用 RemoteMediaClient 的適當 queueLoad 方法,在佇列中載入媒體佇列項目陣列。
接收媒體佇列狀態更新
接收端載入媒體佇列項目時,會為該項目指派專屬 ID,並在工作階段期間 (以及佇列生命週期內) 保留。應用程式可以瞭解佇列的狀態,包括目前載入 (可能未播放)、載入中或預先載入的項目。MediaStatus 類別提供以下狀態資訊:
getPreloadedItemId()方法:如果下一個項目已預先載入,則傳回預先載入的項目 ID。getLoadingItemId()方法:傳回接收器上目前載入 (但未在佇列中啟用) 的項目 ID。getCurrentItemId()方法:傳回媒體狀態變更時,佇列中有效項目的項目 ID (可能未播放)。getQueueItems()(已淘汰,請改用MediaQueue) 方法:以不可修改的清單形式傳回MediaQueueItem執行個體清單。
應用程式也可以使用 MediaQueue 類別取得項目清單。這個類別是媒體佇列的稀疏資料模型。它會保留佇列中的項目 ID 清單,並自動與接收端同步。MediaQueue 不會保留所有 MediaQueueItem,因為佇列很長時會耗用太多記憶體。而是會視需要擷取項目,並保留最近存取項目的 LruCache。您可以使用下列方法存取媒體佇列:
getItemIds()方法:依序傳回所有項目 ID 的清單。getItemAtIndex()方法:傳回指定索引處的快取項目。如果項目未快取,MediaQueue會傳回null,並排定擷取項目的時間。擷取項目時,系統會呼叫MediaQueue.Callback#itemsUpdatedAtIndexes(),再次使用相同 ID 呼叫getItemAtIndex()則會傳回該項目。- 當使用者將佇列 UI 捲動至頂端或底部,且應用程式想從雲端擷取更多項目時,就會使用
fetchMoteItemsRelativeToIndex()。
請搭配使用這些方法和其他媒體狀態方法,讓應用程式瞭解佇列和佇列中項目的狀態。除了接收器傳送的媒體狀態更新外,應用程式也可以實作 RemoteMediaClient.Callback 和 MediaQueue.Callback,監聽佇列變更。
此外,Cast SDK 提供兩個公用程式類別,可用於建立佇列 UI。
MediaQueueRecyclerViewAdapter:用於備份RecyclerView的資料MediaQueueListAdapter,用於備份ListAdapter的資料。
舉例來說,如要使用 MediaQueueRecyclerViewAdapter 建立 RecyclerView,請執行以下操作:
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 }
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 演算法)、從佇列中移除項目,以及重新排序佇列中的項目。