Agregar a una cola

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

El SDK del receptor mantiene la fila y responde a las operaciones en ella siempre que 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 fila hasta que finaliza la reproducción del último elemento o el remitente detiene la reproducción y finaliza la sesión, o hasta que un remitente carga una nueva fila en el receptor. De forma predeterminada, el receptor no mantiene información sobre las filas finalizadas. Una vez que finaliza el último elemento de la fila, se cierra la sesión multimedia y desaparece la fila.

Cómo crear y cargar elementos de la fila de medios

Un elemento de la fila de medios se representa en el framework de Cast como una instancia de MediaQueueItem. Cuando creas un elemento de la fila de reproducción multimedia, si usas la biblioteca de Media Player con contenido adaptable, puedes establecer el tiempo de precarga para que el reproductor pueda comenzar a almacenar en búfer el elemento de la fila de reproducción multimedia antes de que finalice la reproducción del elemento que le precede en la fila. Si configuras 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 la fila de medios 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 fila de medios en la fila con el método queueLoad adecuado de RemoteMediaClient.

Recibir actualizaciones de estado de la fila de medios

Cuando el receptor carga un elemento de la fila de medios, le asigna un ID único que persiste durante la sesión (y la vida útil de la fila). Tu app puede conocer el estado de la fila en términos de qué elemento se cargó, se está cargando o se precargó actualmente (es posible que no se esté reproduciendo). La clase MediaStatus proporciona la siguiente información de estado:

  • Método getPreloadedItemId(): Si se precargó el siguiente elemento, devuelve su ID.
  • Método getLoadingItemId(): Muestra el ID del elemento que se está cargando actualmente (pero que no está activo en la fila) en el receptor.
  • Método getCurrentItemId(): Devuelve 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 de los medios.
  • 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 medios. Mantiene la lista de IDs de elementos en la fila, que se sincroniza automáticamente con el receptor. MediaQueue no conserva todos los MediaQueueItem porque ocuparía 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 medios:

  • 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á en la caché, MediaQueue devolverá null y programará la recuperación del elemento. Cuando se recupera el elemento, se llama a MediaQueue.Callback#itemsUpdatedAtIndexes(), y volver a llamar a getItemAtIndex() con el mismo ID devolverá el elemento.
  • fetchMoteItemsRelativeToIndex() se usa cuando el usuario desplaza 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 medios para informar a tu app sobre el estado de la fila y los elementos que contiene. Además de las actualizaciones del estado de los medios del receptor, tu app puede escuchar los cambios en la fila implementando RemoteMediaClient.Callback y MediaQueue.Callback.

Además, el SDK de Cast proporciona dos clases de utilidad para crear la IU de la 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);
}

Cómo editar la fila

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