Implementa l'API Co-Doing

In questa pagina viene descritto 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 co-doing.

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

Per utilizzare il client, chiama il metodo newSessionBuilder da AddonClient per restituire un builder per una nuova AddonSession. newSessionBuilder implementa l'interfaccia AddonSessionHandler per gestire i callback forniti dal componente aggiuntivo per la sessione.

Per avviare una sessione, aggiungi il metodo withCoDoing allo strumento di creazione.

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 sull'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 trasmetterlo 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 informazioni dettagliate su come ricevere gli aggiornamenti degli annunci da parte di 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 di avvio dell&#39;API Live Sharing.

Riattiva video

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

Sul lato del 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

Proprio come per mettere in pausa il video e riattivare il 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 da guardare 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 viene archiviato in videoState.videoUrl.

Il seguente esempio di codice mostra come informare gli utenti dell'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 co-doing

Quando un utente sceglie di terminare l'attività, il metodo endSession si disconnette dall'app Meet. Questo non costringe Meet a terminare la riunione, né causa l'abbandono della riunione.

Il seguente esempio di codice mostra come inviare una notifica agli utenti della 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 oculate sull'azione da intraprendere in risposta agli aggiornamenti in arrivo, ad esempio associando i timestamp dei video in arrivo solo se sono sufficientemente diversi dal timestamp locale.

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

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