Wdrażanie interfejsu Co-Doing API

Na tej stronie opisujemy, jak wykorzystać interfejs Co-Doing API do obsługi scenariusza wspólnego wykonywania.

Konfiguracja początkowa

Aby przygotować bibliotekę do użycia, aplikacja do udostępniania na żywo powinna zainicjować obiekt CoDoingClient, który reprezentuje sesję wspólnego wykonywania.

Aby używać pakietu SDK udostępniania na żywo w Meet, wywołaj metodę AddonClientFactory.getClient. Zwraca obiekt AddonClient, który jest punktem wejścia sesji wspólnego wykonywania.

Aby użyć klienta, wywołaj metodę newSessionBuilder z AddonClient, aby zwrócić kreator dla nowego obiektu AddonSession. newSessionBuilder implementuje interfejs AddonSessionHandler do obsługi wywołań zwrotnych dostarczanych przez dodatek dla sesji.

Aby rozpocząć sesję, dodaj do kreatora metodę withCoDoing.

Poniższa próbka kodu pokazuje podstawowe inicjowanie obiektu klienta korzystającego ze wspólnego działania:

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

Wstrzymaj film

Jeśli podczas korzystania z funkcji udostępniania na żywo użytkownik wstrzyma odtwarzanie w lokalnej aplikacji wideo, musisz dopilnować, by wszyscy uczestnicy funkcji udostępniania na żywo również wstrzymali odtwarzanie.

Aby to zrobić, utwórz wiadomość CoDoingState wskazującą, że obraz wideo jest wstrzymany, i poproś Google Meet o przekazanie go do wszystkich innych uczestników przy użyciu metody setGlobalState. Udostępniony stan globalny staje się domyślnym stanem dla wszystkich uczestników (istniejących i nowych), dopóki nie zostanie ustawiony nowy stan.

Poniższy przykładowy kod pokazuje, jak powiadomić użytkowników o stanie wstrzymania:

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

Przykładowy kod aktywuje zserializowany obiekt videoState, który ma być transmitowany do wszystkich innych instancji Meet biorących udział w procesie udostępniania na żywo. Szczegółowe informacje o otrzymywaniu aktualnych informacji z transmisji od innych uczestników znajdziesz w sekcji Obsługa przychodzących aktualizacji.

Ten diagram przedstawia sekwencję zdarzeń po wywołaniu działania wstrzymania:

Diagram interfejsu API do uruchamiania udostępniania na żywo.

Cofnij wstrzymanie filmu

Podobnie jak w przypadku wstrzymania wideo, jeśli użytkownik wznowi odtwarzanie wideo w aplikacji lokalnej, Meet musi transmitować tę operację do innych uczestników udostępniania na żywo.

Po stronie nadawcy (użytkownika, który wznawia odtwarzanie filmu) jedyną różnicą w porównaniu z przykładem wstrzymania jest zaktualizowanie stanu isPaused.

Poniższy przykładowy kod pokazuje, jak powiadomić użytkowników o wznowieniu działania od strony nadawcy:

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

Szukaj filmu

Tak samo jak w przypadku wstrzymywania filmu i wznawiania odtwarzania filmu, jeśli użytkownik przeciągnie oś czasu w aplikacji lokalnej do nowej sygnatury czasowej, Meet musi przesłać tę operację do wszystkich uczestników.

Poniższy przykładowy kod pokazuje, jak powiadomić użytkowników o zaktualizowanej sygnaturze czasowej od strony nadawcy:

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

Odtwórz inny film

Jeśli użytkownik zmieni też oglądany film, wybierając inny film w aplikacji lokalnej, Meet musi odtworzyć nowy film u wszystkich uczestników udostępniania na żywo. Zmieniony film jest przechowywany na koncie videoState.videoUrl.

Poniższy przykładowy kod pokazuje, jak powiadomić użytkowników o zaktualizowanym adresie URL filmu:

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

Zakończ wspólne działanie

Gdy użytkownik zdecyduje się zakończyć aktywność, metoda endSession rozłączy się z aplikacją Meet. Nie wymusza to zakończenia spotkania przez Meet ani nie powoduje opuszczenia spotkania przez użytkownika.

Poniższy przykładowy kod pokazuje, jak powiadomić użytkowników o zatrzymanej sesji:

Java

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

Obsługa przychodzących aktualizacji

Gdy aplikacja Meet innego uczestnika otrzyma transmisję, zostanie uruchomione wywołanie zwrotne onGlobalStateChanged(). Zazwyczaj ważne jest, aby podjąć dobre decyzje dotyczące działań, jakie podjąć (w odpowiedzi na przychodzące aktualizacje). Dotyczy to na przykład dopasowywania sygnatur czasowych przychodzących filmów tylko wtedy, gdy różnią się one od lokalnych sygnatur czasowych.

Poniższy przykładowy kod pokazuje, jak obsługiwać różne przychodzące aktualizacje:

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