Wdrażanie interfejsu Co-Doing API

Na tej stronie opisujemy, jak korzystać z interfejsu Co-Doing API do obsługi scenariuszy wspólnego działania.

Konfiguracja początkowa

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

Aby użyć pakietu SDK do udostępniania na żywo w Meet, wywołaj metodę AddonClientFactory.getClient. Zwraca ono element AddonClient, który służy jako punkt wejścia do sesji wspólnego wykonywania.

Aby użyć klienta, wywołaj metodę newSessionBuilder z AddonClient w celu zwrócenia konstruktora dla nowego obiektu AddonSession. newSessionBuilder implementuje interfejs AddonSessionHandler do obsługi wywołań zwrotnych udostępnianych przez dodatek w tej sesji.

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

Poniższy przykładowy kod przedstawia podstawowe zainicjowanie obiektu klienta co-doing:

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 użytkownik korzysta z udostępniania na żywo, a użytkownik wstrzyma odtwarzanie w lokalnej aplikacji wideo, musisz dopilnować, aby wszyscy uczestnicy tego procesu również wstrzymali odtwarzanie filmu.

W tym celu utwórz wiadomość CoDoingState informującą o wstrzymaniu obrazu i poproś Google Meet o transmisję do wszystkich pozostałych uczestników przy użyciu metody setGlobalState. Udostępniony stan globalny staje się domyślnym stanem dla wszystkich uczestników (obecnych lub nowych), dopóki nie zostanie ustawiony nowy stan.

Poniższy przykładowy kod pokazuje, jak powiadamiać 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 zostanie przesłany do wszystkich innych instancji Meet uczestniczących w funkcji udostępniania na żywo. Aby dowiedzieć się, jak otrzymywać aktualizacje od innych uczestników, przeczytaj sekcję Obsługa przychodzących aktualizacji.

Poniższy diagram przedstawia sekwencję zdarzeń po wywołaniu działania wstrzymania:

Uruchom schemat interfejsu Live Share API.

Cofnij wstrzymanie filmu

Podobnie jak w przypadku wstrzymywania wideo, jeśli użytkownik cofnie wstrzymanie odtwarzania w aplikacji lokalnej, Meet musi przekazać tę operację do innych uczestników udostępniania na żywo.

Po stronie nadawcy (czyli użytkownik, który wznawia odtwarzanie filmu) jedyną różnicą w stosunku do przykładu wstrzymania jest aktualizacja stanu isPaused.

Poniższy przykładowy kod pokazuje, jak powiadamiać użytkowników o stanie wznowienia po stronie 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);
}

Przewiń film

Jeśli użytkownik przeciągnie oś czasu w aplikacji lokalnej na nową sygnaturę czasową, Meet musi przesłać tę operację do wszystkich uczestników tak samo jak w przypadku wstrzymywania wideo i wznawiania odtwarzania filmu.

Poniższy przykładowy kod pokazuje, jak powiadomić użytkowników o zaktualizowanej sygnaturze czasowej po stronie 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 wszystkim uczestnikom korzystającym z udostępniania na żywo. Zmieniony film jest przechowywany w folderze 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 wykonywanie

Gdy użytkownik zdecyduje się zakończyć działanie, metoda endSession odłącza się od aplikacji Meet. Nie wymusza to zakończenia spotkania przez Meet ani nie powoduje opuszczenia spotkania przez użytkownika.

Z tego przykładowego kodu dowiesz się, 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ę, wywoływane jest wywołanie zwrotne onGlobalStateChanged(). Zazwyczaj ważne jest, aby podjąć przemyślane decyzje, które podjąć w odpowiedzi na przychodzące aktualizacje. Na przykład dopasować sygnatury czasowe przychodzących filmów tylko wtedy, gdy różnią się od lokalnej sygnatury czasowej.

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