Agregar a una cola

El framework de Cast proporciona clases de cola que admiten la creación de listas de instancias de MediaQueueItem, que se pueden compilar a partir de instancias de MediaInfo, como transmisiones de video o audio, para reproducir de manera secuencial en el receptor. Esta cola de elementos de contenido se puede editar, reordenar, actualizar, etcétera.

El SDK del receptor mantiene la cola y responde a las operaciones en ella siempre que esta tenga al menos un elemento activo (en reproducción o en pausa). Los remitentes pueden unirse a la sesión y agregar elementos a la fila. El receptor mantiene una sesión para los elementos de la cola hasta que el último elemento complete la reproducción o el remitente detenga la reproducción y finalice la sesión, o hasta que un remitente cargue una cola nueva en el receptor. El receptor no mantiene información sobre las colas finalizadas de forma predeterminada. Una vez que finaliza el último elemento de la cola, la sesión multimedia finaliza y la cola desaparece.

Cómo crear y cargar elementos de la cola de contenido multimedia

Un elemento de la cola de contenido multimedia se representa en el framework de Cast como una instancia de MediaQueueItem. Cuando creas un elemento de la cola de contenido multimedia, si usas la biblioteca del Reproductor multimedia con contenido adaptable, puedes establecer el tiempo de precarga para que el reproductor pueda comenzar a almacenar en búfer el elemento de la cola de contenido multimedia antes de que el elemento que lo tiene adelante termine de reproducirse. Si estableces el atributo de reproducción automática del elemento como verdadero, el receptor podrá reproducirlo automáticamente. Por ejemplo, puedes usar un patrón de compilador para crear tu elemento de cola de contenido multimedia de la siguiente manera:

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

Carga un array de elementos de la cola de contenido multimedia en la cola con el método queueLoad adecuado de RemoteMediaClient.

Cómo recibir actualizaciones del estado de la cola de contenido multimedia

Cuando el receptor carga un elemento de la cola de contenido multimedia, le asigna un ID único al elemento que persiste durante la sesión (y el ciclo de vida de la cola). La app puede conocer el estado de la cola en términos de qué elemento está cargado actualmente (es posible que no esté reproduciendo), cargando o precargado. La clase MediaStatus proporciona la siguiente información sobre el estado:

  • Método getPreloadedItemId(): Si se precargó el siguiente elemento, muestra el ID del elemento precargado.
  • Método getLoadingItemId(): Muestra el ID del elemento que se está cargando en ese momento (pero no está activo en la cola) en el receptor.
  • Método getCurrentItemId(): Muestra el ID del elemento que estaba activo en la cola (es posible que no se esté reproduciendo) en el momento en que se produjo el cambio de estado del contenido multimedia.
  • Método getQueueItems() (Obsoleto, usa MediaQueue en su lugar): Muestra la lista de instancias de MediaQueueItem como una lista no modificable.

Tu app también puede obtener la lista de elementos con la clase MediaQueue. La clase es un modelo de datos dispersos de la cola de contenido multimedia. Mantiene la lista de IDs de elementos en la cola, que se sincroniza automáticamente con el receptor. MediaQueue no conserva todos los MediaQueueItem, ya que usará demasiada memoria cuando la cola es muy larga. En cambio, recupera los elementos a pedido y mantiene un LruCache de los elementos a los que se accedió recientemente. Puedes usar estos métodos para acceder a la cola de contenido multimedia:

  • Método getItemIds(): Muestra la lista de todos los IDs de elementos en orden.
  • Método getItemAtIndex(): Muestra el elemento almacenado en caché en un índice determinado. Si el elemento no está almacenado en caché, MediaQueue mostrará null y programará la recuperación del elemento. Cuando se recupere el elemento, se llamará a MediaQueue.Callback#itemsUpdatedAtIndexes(), y si se vuelve a llamar a getItemAtIndex() con el mismo ID, se mostrará el elemento.
  • fetchMoteItemsRelativeToIndex() se usa cuando el usuario se desplaza por la IU de la cola hacia la parte superior o inferior, y tu app quiere recuperar más elementos de la nube.

Usa estos métodos junto con los otros métodos de estado de contenido multimedia para informar a tu app sobre el estado de la cola y los elementos en ella. Además de las actualizaciones de estado del contenido multimedia del receptor, tu app puede escuchar cambios en la cola con la implementación de RemoteMediaClient.Callback y MediaQueue.Callback.

Además, el SDK de Cast proporciona dos clases de utilidades para crear una IU que se pueda agregar a una cola.

Por ejemplo, para crear un RecyclerView con MediaQueueRecyclerViewAdapter, haz lo siguiente:

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

Editar la fila

Para operar en los elementos de la cola, usa los métodos de cola de la clase RemoteMediaClient. Te permiten cargar un array de elementos en una cola nueva, insertar elementos en una cola existente, actualizar las propiedades de los elementos de la cola, hacer que un elemento avance o retroceda en la cola, establecer las propiedades de la cola (por ejemplo, cambiar el algoritmo repeatMode que selecciona el siguiente elemento), quitar elementos de la cola y reordenarlos.