Co-Doing API 구현

이 페이지에서는 Co-Doing API를 사용하여 공동 작업 시나리오를 지원하는 방법을 설명합니다.

초기 설정

사용할 라이브러리를 준비하려면 실시간 공유 애플리케이션이 공동 실행 세션을 나타내는 CoDoingClient 객체를 초기화해야 합니다.

Meet 실시간 공유 SDK를 사용하려면 AddonClientFactory.getClient 메서드를 호출합니다. 그러면 공동 실행 세션의 진입점 역할을 하는 AddonClient가 반환됩니다.

클라이언트를 사용하려면 AddonClient에서 newSessionBuilder 메서드를 호출하여 새 AddonSession의 빌더를 반환합니다. newSessionBuilderAddonSessionHandler 인터페이스를 구현하여 세션의 부가기능에서 제공하는 콜백을 처리합니다.

세션을 시작하려면 빌더에 withCoDoing 메서드를 추가합니다.

다음 코드 샘플은 공동 작업 클라이언트 객체의 기본 초기화를 보여줍니다.

Java

class AwesomeVideoAddonSessionHandler implements AddonSessionHandler {}

//For sample implementation, see the "Handle incoming updates" section.
class AwesomeVideoCoDoingHandler implements CoDoingHandler {}

public ListenableFuture<AddonSession> initialSetup() {
  AddonClient meetClient = AddonClientFactory.getClient();
  return meetClient
      .newSessionBuilder(
          new AwesomeVideoAddonSessionHandler())
      .withCoDoing(new AwesomeVideoCoDoingHandler())
      .begin();
}

동영상 일시중지

실시간 공유 환경에 참여할 때 사용자가 로컬 동영상 앱에서 재생을 일시중지하면 실시간 공유 환경의 모든 참여자도 동영상을 일시중지하도록 해야 합니다.

이렇게 하려면 동영상이 일시중지되었음을 표시하는 CoDoingState 메시지를 작성하고 setGlobalState 메서드를 사용하여 다른 모든 참여자에게 브로드캐스트하도록 Google Meet에 지시합니다. 공유된 전역 상태는 새 상태가 설정될 때까지 기존 또는 신규 참여자의 기본 상태가 됩니다.

다음 코드 샘플은 사용자에게 일시중지 상태를 알리는 방법을 보여줍니다.

Java

public void onVideoPaused(String videoUrl, Instant currentTimestamp) {
  // Create an internal state object to share with other participants. Note: It's
  // good practice to encode all metadata—even seemingly irrelevant data—into
  // ActivityState updates to guard against race conditions and other subtle
  // failures.
  AwesomeVideoState videoState = AwesomeVideoState
    .builder()
    .videoUrl(videoUrl)
    .videoTimestamp(currentTimestamp)
    .isPaused(true)
    .build();

  // Create the CoDoingState object to wrap the internal state
  CoDoingState coDoingState = new CoDoingState();
  coDoingState.state = SerializationUtils.serialize(videoState);

  // Use Meet to broadcast internal state update to all other participants
  this.coDoingClient.setGlobalState(coDoingState);
};

코드 샘플은 직렬화된 videoState 객체를 트리거하여 실시간 공유 환경에 참여하는 다른 모든 Meet 인스턴스에 브로드캐스트합니다. 다른 참여자로부터 브로드캐스트 업데이트를 수신하는 방법에 관한 자세한 내용은 수신 업데이트 처리 섹션을 참고하세요.

다음 다이어그램은 일시중지 작업이 트리거된 후의 이벤트 순서를 보여줍니다.

Start Live Sharing API 다이어그램

동영상 일시중지 해제

동영상 일시중지와 마찬가지로 사용자가 로컬 앱에서 동영상 일시중지를 해제하면 Meet에서 이 작업을 다른 실시간 공유 참여자에게 브로드캐스트해야 합니다.

발신자 (동영상 일시중지를 해제하는 사용자)에서는 일시중지 예와의 유일한 차이점은 isPaused 상태가 업데이트된다는 점입니다.

다음 코드 샘플은 발신자 측에서 사용자에게 일시중지가 해제되었음을 알리는 방법을 보여줍니다.

Java

public void onVideoUnpaused(String videoUrl, Instant currentTimestamp) {
  AwesomeVideoState videoState = AwesomeVideoState
    .builder()
    .videoUrl(videoUrl)
    .videoTimestamp(currentTimestamp)
    .isPaused(false)
    .build();

  CoDoingState coDoingState = new CoDoingState();
  coDoingState.state = SerializationUtils.serialize(videoState);

  this.coDoingClient.setGlobalState(coDoingState);
}

동영상 탐색

동영상 일시중지일시중지 해제와 마찬가지로 사용자가 로컬 앱의 타임라인을 새 타임스탬프로 드래그하면 Meet에서 이 작업을 모든 참여자에게 브로드캐스트해야 합니다.

다음 코드 샘플은 발신자 측에서 업데이트된 타임스탬프를 사용자에게 알리는 방법을 보여줍니다.

Java

public void onVideoSeeked(String videoUrl, Instant currentTimestamp, bool isPaused) {
  AwesomeVideoState videoState = AwesomeVideoState
    .builder()
    .videoUrl(videoUrl)
    .videoTimestamp(currentTimestamp)
    .isPaused(isPaused)
    .build();

  CoDoingState coDoingState = new CoDoingState();
  coDoingState.state = SerializationUtils.serialize(videoState);

  this.coDoingClient.setGlobalState(coDoingState);
}

다른 동영상 재생

사용자가 로컬 앱에서 다른 동영상을 선택하여 시청 중인 동영상도 변경하는 경우 Meet은 모든 실시간 공유 참석자를 위해 새 동영상을 재생해야 합니다. 변경된 동영상은 videoState.videoUrl에 저장됩니다.

다음 코드 샘플은 업데이트된 동영상 URL을 사용자에게 알리는 방법을 보여줍니다.

Java

public void onVideoChanged(String videoUrl, Duration currentTimestamp, bool isPaused) {
  AwesomeVideoState videoState = AwesomeVideoState
    .builder()
    .videoUrl(videoUrl)
    .videoTimestamp(currentTimestamp)
    .isPaused(isPaused)
    .build();

  CoDoingState coDoingState = new CoDoingState();
  coDoingState.state = SerializationUtils.serialize(videoState);

  this.coDoingClient.setGlobalState(coDoingState);
}

공동 작업 종료

사용자가 활동을 종료하기로 선택하면 endSession 메서드와 Meet 앱의 연결이 해제됩니다. 연결을 해제해도 Meet이 강제로 회의를 종료하거나 사용자가 회의에서 나가지는 않습니다.

다음 코드 샘플은 사용자에게 중지된 세션을 알리는 방법을 보여줍니다.

Java

public void endCoDoing() {
  this.session.endSession();
}

수신 업데이트 처리

다른 참여자의 Meet 앱이 브로드캐스트를 수신하면 onGlobalStateChanged() 콜백이 트리거됩니다. 일반적으로 수신 업데이트에 대응하여 어떤 조치를 취할지 결정하는 것이 중요합니다(예: 수신되는 동영상 타임스탬프가 로컬 타임스탬프와 충분히 다른 경우만 일치되는 동영상 타임스탬프).

다음 코드 샘플은 다양한 수신 업데이트를 처리하는 방법을 보여줍니다.

Java

class AwesomeVideoCoDoingHandler implements CoDoingHandler {
  public void onGlobalStateChanged(CoDoingState update) {
    AwesomeVideoState videoState = SerializationUtils.deserialize(update.state());

    // Handle transition to new video.
    if (!videoState.videoUrl.equals(this.videoPlayer.videoUrl)) {
      this.videoPlayer.loadVideo(videoState.videoUrl);
    }

    // If the timestamp in the arriving update has sufficiently diverged, adjust
    // the local video playout.
    if (videoState.videoTimestamp.minus(this.videoPlayer.videoTimestamp).abs() >
                                        Duration.ofSeconds(2)) {
      this.videoPlayer.seek(videoState.videoTimestamp);
    }

    // Update pause state, if necessary.
    if (!videoState.isPaused && this.videoPlayer.isPaused) {
      this.videoPlayer.unpause();
    } else if (videoState.isPaused && !this.videoPlayer.isPaused) {
      this.videoPlayer.pause();
    }
  }
}