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:
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo) .setAutoplay(true) .setPreloadTime(20.0) .build()
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, usaMediaQueue
en su lugar): Muestra la lista de instancias deMediaQueueItem
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 aMediaQueue.Callback#itemsUpdatedAtIndexes()
, y volver a llamar agetItemAtIndex()
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.
MediaQueueRecyclerViewAdapter
, para hacer una copia de seguridad de los datos deRecyclerView
MediaQueueListAdapter
, para crear una copia de seguridad de los datos deListAdapter
Por ejemplo, para crear un RecyclerView
con MediaQueueRecyclerViewAdapter
, haz lo siguiente:
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); }
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.