Co-Doing API 구현

이 페이지에서는 Co-Doing API를 사용하여 공동 작업을 지원하는 방법을 설명합니다. 사용할 수 있습니다

초기 설정

사용할 라이브러리를 준비하려면 실시간 공유 애플리케이션에서 CoDoingClient 공동 수행 세션을 나타내는 객체입니다.

Meet 실시간 공유 SDK를 사용하려면 AddonClientFactory.getClient 메서드를 사용하여 축소하도록 요청합니다. 그러면 AddonClient 공동 진행 세션의 진입점 역할을 합니다.

클라이언트를 사용하려면 newSessionBuilder AddonClient의 메서드를 호출하여 새 AddonSession입니다. newSessionBuilder는 다음을 구현합니다. AddonSessionHandler 인터페이스를 사용하여 세션을 위한 부가기능입니다.

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

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

자바

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 동영상이 일시중지되었음을 보여주는 메시지를 표시하고 Google Meet에 해당 동영상으로 브로드캐스트하도록 지시합니다. 다른 모든 참가자는 setGlobalState 메서드를 사용하여 축소하도록 요청합니다. 공유된 전역 상태는 모든 참가자의 기본 상태가 됩니다. 기존 또는 새 상태가 됩니다

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

자바

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 인스턴스 경험해 볼 수 있습니다 다른 기기 또는 앱에서 브로드캐스트 업데이트를 수신하는 방법에 대한 자세한 내용은 수신 업데이트 처리 섹션으로 이동합니다.

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

Live Sharing API 다이어그램을 시작합니다.

동영상 일시중지 해제

동영상 일시중지와 마찬가지로 사용자가 기기에서 동영상 일시중지를 해제하면 로컬 앱에서 실행 중인 경우 Meet에서 이 작업을 다른 라이브 스트림에 브로드캐스트해야 합니다. 있습니다.

발신자 (동영상 일시중지를 해제하는 사용자) 측면에서 일시중지의 예는 isPaused 상태가 업데이트된 것입니다.

다음 코드 샘플은 사용자에게 발신자 측:

자바

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에서 모든 참석자에게 이 작업을 브로드캐스트해야 합니다.

다음 코드 샘플은 업데이트된 타임스탬프를 사용자에게 알리는 방법을 보여줍니다. 보내는 사람도 있습니다.

자바

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을 사용자에게 알리는 방법을 보여줍니다.

자바

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에서 회의를 종료하거나 사용자가 퇴장하지 않도록 합니다. 회의

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

자바

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

수신 업데이트 처리

다른 참여자의 Meet 앱에서 브로드캐스트를 수신하면 onGlobalStateChanged() 콜백이 트리거됩니다 일반적으로 무엇을 할 것인가에 대해 현명한 결정을 내리는 것이 중요합니다. 일치하는 수신 업데이트에 대응하는 방법 등 동영상 타임스탬프가 로컬 타임스탬프와 충분히 다른 경우

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

자바

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