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