Очередь

Фреймворк Cast предоставляет классы очередей, которые поддерживают создание списков экземпляров MediaQueueItem. Эти списки можно создавать на основе экземпляров MediaInfo, например видео- или аудиопотоков, для последовательного воспроизведения на приемнике. Эту очередь контента можно редактировать, переупорядочивать, обновлять и так далее.

Receiver SDK поддерживает очередь и реагирует на операции в очереди, пока в ней есть хотя бы один активный элемент (воспроизводимый или приостановленный). Отправители могут присоединиться к сеансу и добавить объекты в очередь. Приемник поддерживает сеанс для элементов очереди до тех пор, пока не завершится воспроизведение последнего элемента, отправитель не остановит воспроизведение и не завершит сеанс или пока отправитель не загрузит новую очередь на приемник. По умолчанию получатель не хранит информацию о завершенных очередях. Когда воспроизведение последнего элемента в очереди завершается, сеанс мультимедиа заканчивается, а очередь исчезает.

Создание и загрузка элементов очереди медиаконтента

Элемент очереди медиаконтента представлен в Cast framework как экземпляр MediaQueueItem. Если вы используете библиотеку Media Player с адаптивным контентом, то при создании объекта очереди мультимедиа вы можете задать время предварительной загрузки. Это позволит проигрывателю начать буферизацию объекта очереди мультимедиа до того, как завершится воспроизведение предыдущего объекта. Если для атрибута autoplay задано значение true, то приемник будет воспроизводить контент автоматически. Например, вы можете использовать шаблон построителя, чтобы создать элемент очереди мультимедиа следующим образом:

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

Загрузите массив элементов очереди мультимедиа в очередь, используя соответствующий метод queueLoad класса RemoteMediaClient.

Получение обновлений статуса очереди медиафайлов

Когда приемник загружает элемент очереди мультимедиа, он присваивает ему уникальный идентификатор, который сохраняется на протяжении всего сеанса (и времени существования очереди). Приложение может узнать статус очереди, например какой объект сейчас загружен (он может не воспроизводиться), загружается или предварительно загружен. Класс MediaStatus предоставляет следующую информацию о статусе:

  • getPreloadedItemId() Метод. Если следующий товар был предварительно загружен, возвращает идентификатор товара.
  • getLoadingItemId() Метод, который возвращает идентификатор элемента, загружаемого в данный момент (но неактивного в очереди) на приемнике.
  • Метод getCurrentItemId() возвращает идентификатор элемента, который был активен в очереди (но не обязательно воспроизводился) в момент изменения статуса медиаконтента.
  • Метод getQueueItems() (устарел, используйте MediaQueue) возвращает список экземпляров MediaQueueItem в виде неизменяемого списка.

Приложение также может получить список товаров с помощью класса MediaQueue. Класс представляет собой разреженную модель данных очереди медиаконтента. В нем хранится список идентификаторов элементов в очереди, который автоматически синхронизируется с приемником. MediaQueue не хранит все MediaQueueItem, потому что при длинной очереди это займет слишком много памяти. Вместо этого он извлекает элементы по запросу и сохраняет LruCache недавно использованных элементов. Для доступа к очереди мультимедиа можно использовать следующие методы:

  • getItemIds() Возвращает список идентификаторов всех товаров в заказе.
  • Метод getItemAtIndex() возвращает кешированный объект с заданным индексом. Если объект не кеширован, MediaQueue возвращает null и планирует получение объекта. Когда объект будет получен, будет вызван метод MediaQueue.Callback#itemsUpdatedAtIndexes(), а повторный вызов метода getItemAtIndex() с тем же идентификатором вернет объект.
  • fetchMoteItemsRelativeToIndex() используется, когда пользователь прокручивает интерфейс очереди вверх или вниз и ваше приложение хочет получить больше элементов из облака.

Используйте эти методы вместе с другими методами статуса медиа, чтобы информировать ваше приложение о статусе очереди и элементов в очереди. Помимо обновлений статуса медиаконтента от приемника, ваше приложение может отслеживать изменения в очереди, используя RemoteMediaClient.Callback и MediaQueue.Callback.

Кроме того, Cast SDK предоставляет два служебных класса для создания пользовательского интерфейса для очередей.

Например, чтобы создать RecyclerView с помощью 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);
}

Как изменить очередь

Для работы с элементами в очереди используйте методы очереди класса RemoteMediaClient. Они позволяют загружать массив элементов в новую очередь, вставлять элементы в существующую очередь, обновлять свойства элементов в очереди, перемещать элемент вперед или назад в очереди, задавать свойства самой очереди (например, изменять алгоритм repeatMode, который выбирает следующий элемент), удалять элементы из очереди и изменять порядок элементов в очереди.