排队

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

在队列中使用相应的 queueLoad RemoteMediaClient 方法。

接收媒体队列状态更新

当接收方加载媒体队列项时,它会为该项分配一个唯一 ID 该 ID 在会话期间(以及队列的生命周期内)保持不变。您的 应用可以根据当前已加载的项来了解队列的状态 (可能未播放)、正在加载或预加载。通过 MediaStatus 类提供以下状态信息:

  • getPreloadedItemId() method - 如果下一项已预加载,则返回预加载项的 ID。
  • getLoadingItemId() 方法 - 返回当前正在加载的项目的项目 ID( 在队列中)。
  • getCurrentItemId() 方法 - 返回队列中的有效项的项 ID(它 可能没有播放)。
  • getQueueItems()已弃用,MediaQueue改用)method - 返回 MediaQueueItem 实例显示为不可修改的列表。

您的应用也可以使用 MediaQueue 类。该类是媒体队列的稀疏数据模型。它会保留 数据项 ID,会自动与接收方同步。 MediaQueue 不会保留所有 MediaQueueItem 因为在队列很长时,这将占用过多内存。相反, 按需提取商品,并LruCache 近期访问过的内容。您可以使用以下方法来访问媒体队列:

将这些方法与其他媒体状态方法结合使用 了解队列状态和队列中的项。除了 媒体状态更新,您的应用可以监听对 将代码部署到队列中 RemoteMediaClient.CallbackMediaQueue.Callback

此外,Cast SDK 提供了两个实用程序类,用于创建队列界面。

例如,如需使用 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 算法), 从队列中删除项,并对队列中的项重新排序。