El framework de Cast proporciona clases de lista 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 reproducirlas de forma secuencial en el receptor. Esta cola de elementos de contenido se puede editar, reordenar, actualizar, etcétera.
El SDK de 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 el último elemento completa la reproducción o el remitente detiene la reproducción y finaliza la sesión, o hasta que un remitente carga una fila nueva en el receptor. De forma predeterminada, el receptor no mantiene ninguna información sobre las colas finalizadas. Una vez que finaliza el último elemento de la fila, la sesión multimedia termina y la fila desaparece.
Crea y carga elementos de la fila de contenido multimedia
Un elemento de fila de contenido multimedia se representa en el framework de Cast como una instancia de MediaQueueItem.
Cuando creas un elemento de fila de contenido multimedia, si usas la biblioteca del reproductor multimedia con contenido adaptable, puedes establecer el tiempo de carga previa para que el reproductor pueda comenzar a almacenar en búfer el elemento de fila de contenido multimedia antes de que termine de reproducirse el elemento que lo precede en la fila. Si configuras el atributo autoplay del elemento como verdadero, el receptor podrá reproducirlo automáticamente. Por ejemplo,
puedes usar un patrón de compilador para crear tu elemento de fila de contenido multimedia 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 contenido multimedia en la fila con el método queueLoad adecuado de RemoteMediaClient.
Recibe actualizaciones de estado de la fila de contenido multimedia
Cuando el receptor carga un elemento de la fila de contenido multimedia, 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ó actualmente (es posible que no se esté reproduciendo), se está cargando o se cargó previamente. La clase MediaStatus proporciona la siguiente información de estado:
- Método
getPreloadedItemId(): Si el siguiente artículo se cargó previamente, devuelve el ID de artículo cargado previamente. - Método
getLoadingItemId(): Devuelve el ID de artículo del elemento que se está cargando (pero no está activo en la fila) en el receptor. - Método
getCurrentItemId(): Devuelve el ID del elemento que estaba activo en la fila (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, usaMediaQueueen su lugar): Devuelve la lista de instancias deMediaQueueItemcomo 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 disperso de la cola de contenido multimedia. Mantiene la lista de IDs de artículo en la fila, que se sincroniza automáticamente con el receptor.
MediaQueue no conserva todos los MediaQueueItem porque ocupará demasiada memoria cuando la cola sea 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(): Devuelve la lista de todos los IDs de artículo en orden. - Método
getItemAtIndex(): Devuelve el elemento almacenado en caché en un índice determinado. Si el elemento no se almacena en caché,MediaQueuedevolveránully programará la recuperación del elemento. Cuando se recupere el elemento, se llamará aMediaQueue.Callback#itemsUpdatedAtIndexes(), y, si se vuelve a llamar agetItemAtIndex()con el mismo ID, se devolverá el elemento. fetchMoteItemsRelativeToIndex()se usa cuando el usuario se desplaza por la IU de la fila hacia arriba o hacia abajo, 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 fila y los elementos que contiene. Además de las actualizaciones de estado de contenido multimedia 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 fila.
MediaQueueRecyclerViewAdapter, para crear una copia de seguridad de los datos deRecyclerViewMediaQueueListAdapter, 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); }
Edita la fila
Para operar en los elementos de la cola, usa los métodos de cola de la clase
RemoteMediaClient. Estos te permiten cargar un array de elementos en una nueva fila, insertar elementos en
una fila existente, actualizar las propiedades de los elementos de la fila, hacer que un elemento
avance o retroceda en la fila, establecer las propiedades de la fila en sí
(por ejemplo, cambiar el algoritmo repeatMode que selecciona el siguiente elemento),
quitar elementos de la fila y reordenar los elementos de la fila.