Implémenter l'API Co-Doing

Cette page explique comment utiliser l'API de co-doing pour faciliter le co-doing dans ce scénario.

Configuration initiale

Pour préparer la bibliothèque en vue de son utilisation, l'application de partage en direct doit initialiser une CoDoingClient qui représente une session de co-doigt.

Pour utiliser le SDK de partage en direct Meet, appelez la méthode AddonClientFactory.getClient . Cette opération renvoie une AddonClient qui sert de point d'entrée à la session de co-doigt.

Pour utiliser le client, appelez la méthode newSessionBuilder de AddonClient pour renvoyer un compilateur pour une nouvelle AddonSession Le newSessionBuilder implémente la AddonSessionHandler pour gérer les rappels fournis par la supplémentaire pour la session.

Pour commencer une séance, ajoutez la withCoDoing sur le compilateur.

L'exemple de code suivant montre une initialisation de base du client de co-création objet:

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

Mettre la vidéo en pause

Lors d'une expérience de partage en direct, si un utilisateur met la lecture en pause sur leur application vidéo locale, vous devez vous assurer que tous les participants l'expérience de partage la mettent également en pause.

Pour ce faire, créez un CoDoingState message indiquant que la vidéo est mise en pause et demande à Google Meet de la diffuser tous les autres participants à l'aide du setGlobalState . L'état global partagé devient l'état par défaut pour tous les participants, existante ou nouvelle, jusqu'à ce qu'un nouvel état soit défini.

L'exemple de code suivant montre comment informer les utilisateurs de l'état "Suspendu" :

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'exemple de code déclenche la diffusion de l'objet videoState sérialisé sur toutes les autres instances de Meet participant au partage en direct expérience. Pour savoir comment recevoir des annonces diffusées par d'autres participants, consultez Gérer les mises à jour entrantes. .

Le schéma suivant décrit la séquence des événements après l'action de mise en veille. déclenchée:

Schéma de l&#39;API de partage en direct

Réactiver la vidéo

Comme avec l'option Mettre la vidéo en pause, si l'utilisateur reprend la lecture de la vidéo sur sa application locale, Meet doit diffuser cette opération aux autres partager des participants.

Du côté de l'expéditeur (l'utilisateur qui réactive la vidéo), la seule différence l'exemple de mise en veille indique que l'état isPaused est mis à jour.

L'exemple de code suivant montre comment informer les utilisateurs que la fonctionnalité est réactivée côté expéditeur:

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

Rechercher une vidéo

Comme pour mettre la vidéo en pause et la réactiver, procédez comme suit : si un utilisateur fait glisser la chronologie de l'application locale vers un nouvel horodatage, Meet doit diffuser cette opération auprès de tous les participants.

L'exemple de code suivant montre comment informer les utilisateurs du code temporel mis à jour du côté de l'expéditeur:

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

Lire une autre vidéo

Si l'utilisateur modifie également la vidéo en cours de visionnage en sélectionnant une autre vidéo sur l'application locale, Meet doit lire la nouvelle vidéo pour tous les partages en direct participants. La vidéo modifiée est stockée dans videoState.videoUrl.

L'exemple de code suivant montre comment informer les utilisateurs de la mise à jour de l'URL de la vidéo:

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

Mettre fin au codo

Lorsqu'un utilisateur choisit de mettre fin à l'activité, endSession se déconnecte de l'application Meet. Cela ne vous oblige pas Meet met fin à la réunion et n'entraîne pas la fermeture de l'utilisateur réunion.

L'exemple de code suivant montre comment avertir les utilisateurs de l'arrêt de la session:

Java

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

Gérer les mises à jour entrantes

Lorsque l'application Meet d'un autre participant reçoit une annonce, onGlobalStateChanged() est déclenché. En général, il est important de prendre de bonnes décisions sur ce que action à entreprendre en réponse aux mises à jour entrantes (par exemple, uniquement les correspondances entrantes les codes temporels de la vidéo s'ils sont suffisamment différents du code temporel local.

L'exemple de code suivant montre comment gérer les différentes mises à jour entrantes:

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