Auf dieser Seite wird beschrieben, wie Sie mit der Co-Doing API ein Co-Doing unterstützen können. Szenario.
Ersteinrichtung
Um die Bibliothek für die Verwendung vorzubereiten, sollte mit der Anwendung „Live teilen“ ein
CoDoingClient
, das eine Co-Doing-Sitzung darstellt.
Wenn Sie das Meet Live Sharing SDK verwenden möchten, rufen Sie die
AddonClientFactory.getClient
. Dadurch wird ein
AddonClient
das als Einstiegspunkt für die Co-Doing-Sitzung dient.
Rufen Sie zur Verwendung des Clients die Methode
newSessionBuilder
aus AddonClient
, um einen Builder für ein neues
AddonSession
newSessionBuilder
implementiert die
AddonSessionHandler
verwendet, um die Callbacks zu verarbeiten, die vom
Add-on hinzufügen.
Um eine Sitzung zu beginnen, füge den
withCoDoing
auf den Builder übergeben.
Das folgende Codebeispiel zeigt eine grundlegende Initialisierung des Co-Doing-Clients -Objekt enthält:
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 pausiert, wenn er die Funktion „Live teilen“ verwendet müssen Sie dafür sorgen, dass alle Teilnehmer das Video auch pausiert.
Dazu erstellen Sie ein
CoDoingState
an, dass das Video pausiert wurde, und weisen Sie Google Meet an, eine Nachricht an alle zu senden.
alle anderen Teilnehmenden mithilfe der
setGlobalState
. Der gemeinsame globale Status wird
zum Standardstatus für alle Teilnehmer,
vorhanden oder neu sein, 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);
};
Das Codebeispiel löst das serialisierte videoState
-Objekt für die Übertragung an
alle anderen Meet-Instanzen, bei denen die Funktion „Live teilen“ verwendet wird
Nutzererfahrung. Weitere Informationen zum Empfangen von Broadcast-Updates von anderen
erhalten Sie im Artikel Umgang mit eingehenden Updates
.
Das folgende Diagramm zeigt die Abfolge der Ereignisse nach der Pause. ausgelöst:
Pausierung des Videos aufheben
Ähnlich wie beim Pausieren des Videos gilt: in der lokalen App, dann muss Meet diesen Vorgang live an andere für die Freigabe der Teilnehmenden.
Der einzige Unterschied aufseiten des Absenders (Nutzer, der die Pausierung des Videos aufhebt)
Das Pausenbeispiel ist, dass der Status isPaused
aktualisiert wird.
Im folgenden Codebeispiel wird gezeigt, wie Sie Nutzer über den Status der aufgehobenen Pausierung auf der Absenderseite:
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);
}
Videosuche
Genau wie bei den Funktionen zum Pausieren des Videos und Fortsetzen der Wiedergabe: wenn Nutzende die Zeitachse in der lokalen App auf einen neuen Zeitstempel ziehen, Dieser Vorgang muss in Meet an alle Teilnehmer übertragen werden.
Das folgende Codebeispiel zeigt, wie Nutzer über den aktualisierten Zeitstempel informiert werden von der Absenderseite aus:
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 Video ändert, indem er auf
die lokale App verwenden, muss Meet bei allen „Live teilen“-Funktionen das neue Video abspielen
Teilnehmenden. 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);
}
Gemeinsame Bearbeitung beenden
Wenn ein Nutzer sich entscheidet, die Aktivität zu beenden,
endSession
wird die Verbindung zur Meet App getrennt. Dies erzwingt keine
wird die Videokonferenz beendet und der Nutzer verlässt die Besprechung nicht.
zu treffen.
Das folgende Codebeispiel zeigt, wie Nutzer über die beendete Sitzung benachrichtigt 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 das Symbol
onGlobalStateChanged()
Callback ausgelöst. Normalerweise ist es wichtig,
gute Entscheidungen darüber zu treffen,
als Reaktion auf eingehende Updates auszuführen, z. B. nur für den Abgleich eingehender
Videozeitstempel, wenn sie sich ausreichend vom lokalen Zeitstempel unterscheiden.
Das folgende Codebeispiel zeigt, wie die verschiedenen eingehenden Updates 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();
}
}
}