전송의 현재 재생목록 모델은 MediaSession의 현재 재생목록 모델과 다릅니다. Cast Connect 라이브러리는 MediaSession에서 제공하는 큐 읽기를 지원하지 않습니다.

대기열 로드 및 대기열 정보 설정 처리

대기열 로드는 인텐트로 활동을 시작하는 방식으로 단일 항목을 로드하는 것과 동일한 방식으로 실행됩니다. Google 클라이언트 라이브러리를 사용하여 인텐트를 MediaLoadRequestData로 파싱해야 합니다. MediaQueueData 필드에는 로드할 큐 정보가 포함됩니다.

Kotlin
fun handleCastLoad(requestData: MediaLoadRequestData?) {
  if (requestData.getQueueData()) {
    // If MediaQueueData is specified, this is a queue load request.
    myPlayer.load(
          requestData.getQueueData().getItems().get(0))

    // Set media status.
    castReceiverContext.getMediaManager()
        .setDataFromLoad(requestData) // This clears all status overrides.
                                      // The queue information is updated with
                                      // the MediaQueueData in the request.
        ...

    mediaSession.setPlaybackState(...)
  }
}
Java
private void handleCastLoad(MediaLoadRequestData requestData) {
  if (requestData.getQueueData()) {
    // If MediaQueueData is specified, this is a queue load request.
    myPlayer.load(
        requestData.getQueueData().getItems().get(0));

    // Set media status.
    castReceiverContext.getMediaManager()
        .setDataFromLoad(requestData) // This clears all status overrides.
                                      // The queue information is updated with
                                      // the MediaQueueData in the request.
        ...;

    mediaSession.setPlaybackState(...);
  }
}

현재 재생목록 변경

큐에 변경사항이 있으면 (예: queueInsert()에서) MediaQueueManager를 사용하여 큐를 업데이트할 수 있습니다. 새 대기열 항목을 만드는 경우 빌더에서 MediaQueueManager.autoGenerateItemId()를 사용하여 항목 ID를 생성하는 setItemId()를 호출하여 항목 ID를 설정해야 합니다. setDataFromLoad()를 통해 로드된 대기열의 항목에는 이미 항목 ID가 설정되어 있습니다.

Kotlin
val mediaManager: MediaManager = castReceiverContext.getMediaManager()

val mediaQueueManager = mediaManager.getMediaQueueManager()

mediaQueueManager.getQueueItems().add( /* position= */index, mediaQueueItem)

mediaManager.broadcastMediaStatus()
Java
MediaManager mediaManager = castReceiverContext.getMediaManager();

MediaQueueManager mediaQueueManager = mediaManager.getMediaQueueManager();

mediaQueueManager.getQueueItems().add(/* position= */ index, mediaQueueItem);

mediaManager.broadcastMediaStatus();

Android TV 앱은 onQueueUpdate() 콜백도 처리하여 현재 재생목록 항목으로 이동하고 다음/이전 건너뛰기를 지원합니다.

Kotlin
class MyMediaCommandCallback : MediaCommandCallback() {
    override fun onQueueUpdate(
        queueUpdateRequestData: QueueUpdateRequestData ): Task {
        ...
        var newItemId = MediaQueueItem.INVALID_ITEM_ID
        if (queueUpdateRequestData.getJump() != null) {
            newItemId = myGetRelativeItemId(queueUpdateRequestData.getJump())
        } else if (queueUpdateRequestData.getCurrentItemId() != null) {
            newItemId = queueUpdateRequestData.getCurrentItemId()
        }
        if (newItemId != MediaQueueItem.INVALID_ITEM_ID) {
            castReceiverContext.getMediaManager().getMediaQueueManager()
                .setCurrentItemId(newItemId)
            castReceiverContext.getMediaManager().broadcastMediaStatus()
        }
    }
}

val mediaManager = CastReceiverContext.getInstance().getMediaQueueManager()
mediaManager.setMediaCommandCallback(MyMediaCommandCallback())
Java
public class MyMediaCommandCallback extends MediaCommandCallback {
  @Override
  public Task onQueueUpdate(
      QueueUpdateRequestData queueUpdateRequestData) {
    ...
    int newItemId = MediaQueueItem.INVALID_ITEM_ID;
    if (queueUpdateRequestData.getJump() != null) {
      newItemId = myGetRelativeItemId(queueUpdateRequestData.getJump());
    } else if (queueUpdateRequestData.getCurrentItemId() != null) {
      newItemId = queueUpdateRequestData.getCurrentItemId();
    }

    if (newItemId != MediaQueueItem.INVALID_ITEM_ID) {
      castReceiverContext.getMediaManager().getMediaQueueManager()
          .setCurrentItemId(newItemId);
      castReceiverContext.getMediaManager().broadcastMediaStatus();
    }
}

MediaManager mediaManager =
    CastReceiverContext.getInstance().getMediaManager();
mediaManager.setMediaCommandCallback(new MyMediaCommandCallback());

onSkipToNext(), onSkipToPrevious(), onSkipToQueueItem()와 같은 대기열 관련 전송 제어 콜백을 구현하는 것도 좋습니다.

Kotlin
class MyMediaSessionCallback : MediaSessionCompat.Callback() {
  override fun onSkipToNext() {
    // Skip to next item in queue
    ...
  }

  override fun onSkipToPrevious() {
    // Skip to previous item in queue
    ...
  }

  override fun onSkipToQueueItem(pos: Long) {
    // Skip to specified queue item
    ...
  }
    ...
}

mediaSession.setCallback(MyMediaSessionCallback())
Java
public class MyMediaSessionCallback extends MediaSessionCompat.Callback {
  @Override
  public void onSkipToNext() {
    // Skip to next item in queue
    ...
  }

  @Override
  public void onSkipToPrevious() {
    // Skip to previous item in queue
    ...
  }

  @Override
  public void onSkipToQueueItem (long pos) {
    // Skip to specified queue item
    ...
  }
  ...
}

mediaSession.setCallback(new MyMediaSessionCallback());