Co-Doing API implementieren

Auf dieser Seite wird beschrieben, wie die Co-Doing API zur Unterstützung eines Co-Doing-Szenarios verwendet wird.

Ersteinrichtung

Zur Vorbereitung der Bibliothek für die Verwendung sollte die Live Sharing-Anwendung ein CoDoingClient-Objekt initialisieren, das eine gemeinsame Sitzung darstellt.

Rufen Sie die Methode AddonClientFactory.getClient auf, um das Meet Live Sharing SDK zu verwenden. Dadurch wird ein AddonClient zurückgegeben, das als Einstiegspunkt für die gemeinsame Sitzung dient.

Wenn Sie den Client verwenden möchten, rufen Sie die Methode newSessionBuilder aus dem AddonClient auf, um einen Builder für eine neue AddonSession zurückzugeben. Der newSessionBuilder implementiert die Schnittstelle AddonSessionHandler zur Verarbeitung der Callbacks, die vom Add-on für die Sitzung bereitgestellt werden.

Fügen Sie dem Builder die Methode withCoDoing hinzu, um eine Sitzung zu starten.

Das folgende Codebeispiel zeigt eine grundlegende Initialisierung des Co-Doing-Clientobjekts:

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

Video anhalten

Wenn ein Nutzer die Wiedergabe in seiner lokalen Video-App pausiert, müssen Sie dafür sorgen, dass alle Teilnehmer das Video ebenfalls anhalten.

Schreiben Sie dazu eine CoDoingState-Nachricht, in der angezeigt wird, dass das Video pausiert ist, und weisen Sie Google Meet an, die Nachricht an alle anderen Teilnehmer mit der Methode setGlobalState zu senden. Der gemeinsame globale Status wird zum Standardstatus für alle vorhandenen oder neuen Teilnehmer, bis ein neuer Status festgelegt wird.

Das folgende Codebeispiel zeigt, wie Nutzer über den Status „Pausiert“ informiert werden:

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

Mit dem Codebeispiel wird ausgelöst, dass das serielle Objekt videoState an alle anderen Meet-Instanzen gesendet wird, die Teil der Funktion „Live teilen“ sind. Weitere Informationen dazu, wie Sie Broadcast-Updates von anderen Teilnehmern erhalten, finden Sie im Abschnitt Umgang mit eingehenden Updates.

Im folgenden Diagramm wird die Abfolge der Ereignisse nach dem Auslösen der Pausenaktion dargestellt:

Diagramm zum Starten der Live Sharing API

Pausierung des Videos aufheben

Ähnlich wie bei Video anhalten gilt: Wenn ein Nutzer die Pausierung des Videos in seiner lokalen App aufhebt, muss Meet diesen Vorgang an andere Teilnehmer der Live-Freigabe übertragen.

Auf der Absenderseite (dem Nutzer, der die Pausierung des Videos wieder aufhebt) besteht der einzige Unterschied zum Pausenbeispiel darin, dass der Status isPaused aktualisiert wird.

Das folgende Codebeispiel zeigt, wie Nutzer von der Absenderseite über den nicht pausierten Status informiert werden:

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

Video suchen

Wenn ein Nutzer die Zeitachse in der lokalen App auf einen neuen Zeitstempel zieht, muss Meet wie unter Video pausieren und Videopausierung wieder aktivieren diesen Vorgang an alle Teilnehmer übertragen.

Das folgende Codebeispiel zeigt, wie Nutzer von der Absenderseite über den aktualisierten Zeitstempel informiert werden:

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

Anderes Video abspielen

Wenn der Nutzer das angesehene Video durch Auswahl eines anderen Videos in der lokalen App ändert, muss Meet das neue Video für alle Teilnehmer der „Live teilen“-Sitzung abspielen. Das geänderte Video wird in videoState.videoUrl gespeichert.

Das folgende Codebeispiel zeigt, wie Nutzer über die aktualisierte Video-URL informiert werden:

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

Gemeinsames Vorgehen beenden

Wenn ein Nutzer beschließt, die Aktivität zu beenden, wird die Verbindung zur Meet App über die Methode endSession getrennt. Dadurch wird Meet nicht gezwungen, die Videokonferenz zu beenden, und führt nicht dazu, dass der Nutzer die Videokonferenz verlässt.

Das folgende Codebeispiel zeigt, wie Nutzer über die beendete Sitzung informiert werden:

Java

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

Eingehende Updates verarbeiten

Wenn die Meet App eines anderen Teilnehmers eine Nachricht an alle empfängt, wird der onGlobalStateChanged()-Callback ausgelöst. Normalerweise ist es wichtig, gute Entscheidungen darüber zu treffen, welche Maßnahmen als Reaktion auf eingehende Aktualisierungen ausgeführt werden sollen. Beispiel: Ein Abgleich der Zeitstempel eingehender Videos muss nur dann erfolgen, wenn sie sich ausreichend vom lokalen Zeitstempel unterscheiden.

Das folgende Codebeispiel zeigt, wie die verschiedenen eingehenden Aktualisierungen verarbeitet werden:

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