Implementa l'API Co-Doing

Questa pagina descrive come utilizzare l'API Co-Doing per supportare uno scenario di co-doing.

Configurazione iniziale

Per preparare la libreria all'uso, l'applicazione di condivisione in tempo reale deve inizializzare un oggetto CoDoingClient che rappresenta una sessione di condivisione in tempo reale.

Per utilizzare l'SDK Condivisione in tempo reale di Meet, chiama il metodo AddonClientFactory.getClient. Questa operazione restituisce un elemento AddonClient che funge da punto di ingresso per la sessione di co-doing.

Per utilizzare il client, chiama il metodo newSessionBuilder da AddonClient per restituire uno strumento per la creazione di un nuovo AddonSession. newSessionBuilder implementa l'interfaccia AddonSessionHandler per gestire i callback forniti dal componente aggiuntivo per la sessione.

Per iniziare una sessione, aggiungi il metodo withCoDoing al builder.

Il seguente esempio di codice mostra un'inizializzazione di base dell'oggetto client di 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();
}

Metti in pausa il video

Quando partecipi a un'esperienza di condivisione in tempo reale, se un utente mette in pausa la riproduzione nell'app video locale, devi assicurarti che anche tutti i partecipanti all'esperienza di condivisione in tempo reale mettano in pausa il video.

Per farlo, crea un messaggio CoDoingState che mostri che il video è in pausa e chiedi a Google Meet di trasmettere a tutti gli altri partecipanti utilizzando il metodo setGlobalState. Lo stato globale condiviso diventa lo stato predefinito per tutti i partecipanti, esistenti o nuovi, fino a quando non viene impostato un nuovo stato.

Il seguente esempio di codice mostra come notificare agli utenti lo stato di pausa:

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

L'esempio di codice attiva la trasmissione dell'oggetto videoState serializzato a tutte le altre istanze di Meet che partecipano all'esperienza di condivisione in tempo reale. Per maggiori dettagli su come ricevere aggiornamenti sulla trasmissione da altri partecipanti, consulta la sezione Gestire gli aggiornamenti in arrivo.

Il seguente diagramma descrive la sequenza di eventi dopo l'attivazione dell'azione di pausa:

Diagramma dell&#39;avvio dell&#39;API Live Sharing.

Riattiva video

Come per Metti in pausa il video, se un utente riattiva il video nell'app locale, Meet deve trasmettere questa operazione agli altri partecipanti alla condivisione in tempo reale.

Per quanto riguarda il mittente (l'utente che riattiva il video), l'unica differenza rispetto all'esempio di pausa è che lo stato isPaused viene aggiornato.

Il seguente esempio di codice mostra come notificare agli utenti lo stato riattivato dal lato mittente:

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

Cerca video

Come per Metti in pausa il video e Riattiva video, se un utente trascina la sequenza temporale sull'app locale su un nuovo timestamp, Meet deve trasmettere questa operazione a tutti i partecipanti.

Il seguente esempio di codice mostra come notificare agli utenti il timestamp aggiornato dal lato mittente:

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

Riproduci un video diverso

Se l'utente cambia anche il video in riproduzione selezionando un altro video nell'app locale, Meet deve riprodurre il nuovo video per tutti i partecipanti alla condivisione in tempo reale. Il video modificato è memorizzato in videoState.videoUrl.

Il seguente esempio di codice mostra come comunicare agli utenti l'URL del video aggiornato:

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

Termina la collaborazione

Quando un utente sceglie di terminare l'attività, il metodo endSession si disconnette dall'app Meet. Questo non obbliga Meet a terminare la riunione, né l'utente ad abbandonare la riunione.

Il seguente esempio di codice mostra come notificare agli utenti la sessione interrotta:

Java

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

Gestire gli aggiornamenti in arrivo

Quando l'app Meet di un altro partecipante riceve un annuncio, viene attivato il callback di onGlobalStateChanged(). Di solito, è importante prendere decisioni corrette in merito all'azione da intraprendere in risposta agli aggiornamenti in arrivo, ad esempio far corrispondere i timestamp dei video in entrata solo se sono sufficientemente diversi dal timestamp locale.

Il seguente esempio di codice mostra come gestire i diversi aggiornamenti in arrivo:

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