Enfileiramento

O framework do Google Cast fornece classes de enfileiramento que oferecem suporte à criação de listas de instâncias de MediaQueueItem, que podem ser criadas com base em instâncias de MediaInfo, como streams de vídeo ou áudio, para reprodução sequencial no receptor. É possível editar, reordenar, atualizar essa fila de itens e assim por diante.

O SDK do receptor mantém a fila e responde a operações na fila, desde que ela tenha pelo menos um item ativo no momento (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 interrompa 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 informações sobre filas encerradas. Quando o último item da fila termina, a sessão de mídia é encerrada e a fila desaparece.

Criar e carregar itens da fila de mídia

Um item da fila de mídia é representado no framework do Google Cast como uma instância MediaQueueItem. Ao criar um item de fila de mídia, se você estiver usando a biblioteca do player de mídia com conteúdo adaptável, poderá definir o tempo de pré-carregamento para que o player possa começar a armazenar 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 "true" permite que o receptor o reproduza automaticamente. Por exemplo, é possível usar um padrão builder para criar o item da fila de mídia da seguinte maneira:

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

Carregue uma matriz de itens da fila de mídia usando o método queueLoad apropriado 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 pela duração da sessão (e da vida da fila). O app pode saber o status da fila em termos de qual item está carregado no momento (pode não estar sendo reproduzido), carregando ou pré-carregado. A classe MediaStatus fornece estas informações de status:

  • Método getPreloadedItemId(): se o próximo item foi pré-carregado, retorna o ID do item pré-carregado.
  • Método getLoadingItemId(): retorna o ID do item que está sendo carregado no momento, mas que não está ativo na fila, no receptor.
  • Método getCurrentItemId(): retorna o ID do item que estava ativo na fila (pode não estar sendo reproduzido) no momento em que a mudança de status da mídia ocorreu.
  • Método getQueueItems() (descontinuado, use MediaQueue): retorna a lista de instâncias de MediaQueueItem como uma lista não modificável.

O app também pode receber a lista de itens usando a classe MediaQueue. A classe é um modelo de dados esparsos da fila de mídia. Ele mantém a lista de IDs de item na fila, que é automaticamente sincronizada com o destinatário. O MediaQueue não mantém todo o MediaQueueItem, porque consome muita memória quando a fila é muito longa. Em vez disso, ele busca os itens sob demanda e mantém um LruCache dos itens acessados recentemente. Use estes métodos para acessar a fila de mídia:

  • Método getItemIds(): retorna a lista de todos os códigos de item em ordem.
  • Método getItemAtIndex(): retorna o item em cache em um determinado índice. Se o item não estiver armazenado em cache, MediaQueue vai retornar null e programar a busca do item. Quando o item for buscado, MediaQueue.Callback#itemsUpdatedAtIndexes() será chamado, e chamar getItemAtIndex() com o mesmo ID novamente vai retornar o item.
  • O fetchMoteItemsRelativeToIndex() é usado quando o usuário rola a IU da fila para cima ou para baixo e o app quer buscar mais itens da nuvem.

Use esses métodos com os outros métodos de status de mídia para informar ao app sobre o status da fila e os itens nela. Além das atualizações de status de mídia do receptor, o app pode detectar mudanças na fila implementando RemoteMediaClient.Callback e MediaQueue.Callback.

Além disso, o SDK do Cast fornece duas classes de utilitários para criar uma interface para enfileiramento.

Por exemplo, para criar um RecyclerView usando MediaQueueRecyclerViewAdapter:

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 a fila

Para operar nos itens da fila, use os métodos da classe RemoteMediaClient. Eles permitem carregar uma matriz de itens em uma nova fila, inserir itens em uma fila existente, atualizar as propriedades de itens na fila, fazer um item avançar ou retroceder, definir as propriedades da própria fila (por exemplo, mudar o algoritmo repeatMode que seleciona o próximo item), remover itens da fila e reordená-los.