O framework do Cast oferece classes de enfileiramento que permitem criar listas
de instâncias de MediaQueueItem
que podem ser criadas com instâncias de MediaInfo
, como streams de vídeo ou áudio, para serem reproduzidas sequencialmente no receptor. Essa fila de itens de conteúdo pode ser editada, reordenada, atualizada e assim por diante.
O SDK do receptor mantém a fila e responde às operações nela enquanto houver pelo menos um item ativo (em reprodução ou pausado). Os remetentes podem participar da sessão e adicionar itens à fila. O receptor mantém uma sessão para itens da fila até que o último item conclua a reprodução ou o remetente pare a reprodução e encerre a sessão, ou até que um remetente carregue uma nova fila no receptor. Por padrão, o receptor não mantém nenhuma informação sobre filas encerradas. Quando o último item da fila terminar, a sessão de mídia será encerrada e a fila vai desaparecer.
Criar e carregar itens da fila de mídia
Um item da fila de mídia é representado no framework Cast como uma
instância
MediaQueueItem
.
Ao criar um item de fila de mídia, se você estiver usando a Biblioteca do Media Player com conteúdo adaptável, defina o tempo de pré-carregamento para que o player possa começar a armazenar em buffer o item da fila de mídia antes que o item anterior na fila termine de ser reproduzido. Definir o atributo de reprodução automática do item como verdadeiro permite que o receptor o reproduza automaticamente. Por exemplo,
use um padrão de builder para criar seu item da fila de mídia da seguinte forma:
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo) .setAutoplay(true) .setPreloadTime(20.0) .build()
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo) .setAutoplay(true) .setPreloadTime(20) .build();
Carregue uma matriz de itens da fila de mídia usando o método
queueLoad
adequado de RemoteMediaClient
.
Receber atualizações de status da fila de mídia
Quando o receptor carrega um item da fila de mídia, ele atribui um ID exclusivo ao item
que persiste durante a sessão (e a vida útil da fila). Seu
app pode saber o status da fila em termos de qual item está carregado
(pode não estar em reprodução), carregando ou pré-carregado. A classe
MediaStatus
fornece estas informações de status:
- Método
getPreloadedItemId()
– se o próximo item tiver sido pré-carregado, retorna o ID do item pré-carregado. - Método
getLoadingItemId()
– Retorna o ID do item que está sendo carregado (mas não está ativo na fila) no receptor. - O método
getCurrentItemId()
retorna o ID do item que estava ativo na fila (ele pode não estar sendo reproduzido) no momento em que a mudança de status da mídia ocorreu. - Método
getQueueItems()
(descontinuado, useMediaQueue
) - Retorna a lista de instânciasMediaQueueItem
como uma lista imutável.
Seu app também pode receber a lista de itens usando a classe
MediaQueue
. A classe é um modelo de dados esparso da fila de mídia. Ele mantém a lista de IDs de itens na fila, que é sincronizada automaticamente com o receptor.
O MediaQueue
não mantém todos os
MediaQueueItem
porque isso ocuparia muita memória quando a fila estiver muito longa. Em vez disso, ele busca os itens sob demanda e mantém um LruCache
de itens acessados recentemente. Use estes métodos para acessar a fila de mídia:
- O método
getItemIds()
retorna a lista de todos os IDs de itens em ordem. - Método
getItemAtIndex()
– Retorna o item em cache em um determinado índice. Se o item não estiver em cache,MediaQueue
vai retornarnull
e programar a busca do item. Quando o item for buscado,MediaQueue.Callback#itemsUpdatedAtIndexes()
será chamado, e chamargetItemAtIndex()
com o mesmo ID novamente vai retornar o item. fetchMoteItemsRelativeToIndex()
é usado quando o usuário rola a interface da fila para cima ou para baixo, e o app quer buscar mais itens na nuvem.
Use esses métodos com os outros métodos de status de mídia para informar seu
app sobre o status da fila e os itens nela. Além das
atualizações de status de mídia do receptor, seu app pode detectar mudanças na
fila implementando
RemoteMediaClient.Callback
e
MediaQueue.Callback
.
Além disso, o SDK do Cast oferece duas classes de utilitário para criar a interface de enfileiramento.
MediaQueueRecyclerViewAdapter
, para fazer backup dos dados deRecyclerView
MediaQueueListAdapter
para fazer backup dos dados deListAdapter
.
Por exemplo, para criar um RecyclerView
usando MediaQueueRecyclerViewAdapter
:
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); }
Editar a fila
Para operar nos itens da fila, use os métodos da classe
RemoteMediaClient
. Com elas, é possível carregar uma matriz de itens em uma nova fila, inserir itens em uma fila existente, atualizar as propriedades dos itens na fila, fazer um item avançar ou voltar na fila, definir as propriedades da própria fila (por exemplo, mudar o algoritmo repeatMode
que seleciona o próximo item), remover itens da fila e reordenar os itens nela.