Implementar a API Co-Doing

Esta página descreve como usar a API Co-Doing para dar suporte a uma ação conjunta diferente.

Configuração inicial

Para preparar a biblioteca para uso, o aplicativo de compartilhamento ao vivo precisa inicializar um CoDoingClient que representa uma sessão compartilhada.

Para usar o SDK de compartilhamento ao vivo do Meet, chame o método AddonClientFactory.getClient . Isso retorna uma AddonClient que serve como ponto de entrada para a sessão de co-participação.

Para usar o cliente, chame o método newSessionBuilder do AddonClient para retornar um builder para uma nova AddonSession O newSessionBuilder implementa o AddonSessionHandler para lidar com os retornos de chamada fornecidos pelo para a sessão.

Para iniciar uma sessão, adicione o withCoDoing no builder.

O exemplo de código a seguir mostra uma inicialização básica do cliente de co-doing objeto:

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

Pausar vídeo

Em uma experiência de compartilhamento ao vivo, se um usuário pausar a reprodução no aplicativo de vídeo local deles, certifique-se de que todos os participantes do evento de compartilhamento também pausam o vídeo.

Para fazer isso, crie uma CoDoingState mensagem mostrando que o vídeo está pausado e pedir para o Google Meet transmitir para ele todos os outros participantes usando o setGlobalState . O estado global compartilhado se torna o padrão para todos os participantes. atual ou novo, até que um novo estado seja definido.

O exemplo de código a seguir mostra como notificar os usuários sobre o estado pausado:

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

O exemplo de código aciona o objeto videoState serializado a ser transmitido para Todas as outras instâncias do Meet que participam do compartilhamento ao vivo do usuário. Para detalhes sobre como receber atualizações de transmissão de outros participantes, consulte a documentação Gerenciar atualizações recebidas nesta seção.

O diagrama a seguir descreve a sequência de eventos após a ação de pausa acionada:

Inicie o diagrama da API Live Share.

Retomar vídeo

Semelhante ao vídeo em pausa, se um usuário retomar o vídeo no próprio app local, o Meet vai transmitir a operação para outros usuários o compartilhamento de participantes.

Para o remetente (o usuário que retoma o vídeo), a única diferença do o exemplo de pausa é que o status isPaused é atualizado.

O exemplo de código a seguir mostra como notificar os usuários sobre o estado retomado da lado do remetente:

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

Procurar vídeo

Assim como os recursos pausar vídeo e retomar vídeo, se um usuário arrastar a linha do tempo no aplicativo local para um novo carimbo de data/hora, O Meet precisa transmitir essa operação para todos os participantes.

O exemplo de código a seguir mostra como notificar os usuários sobre o carimbo de data/hora atualizado do remetente:

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

Assistir outro vídeo

Se o usuário também alterar o vídeo que está sendo assistido selecionando outro vídeo no o app local, o Meet precisa abrir o novo vídeo para todos os compartilhamentos ao vivo participantes. O vídeo alterado está armazenado em videoState.videoUrl.

O exemplo de código a seguir mostra como notificar os usuários sobre o URL atualizado do vídeo:

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

Encerrar cofazer

Quando um usuário decide encerrar a atividade, endSession é desconectado do app Meet. Isso não força o Meet para encerrar a reunião, nem faz com que o usuário saia da reunião.

O exemplo de código a seguir mostra como notificar os usuários sobre a sessão interrompida:

Java

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

Processar atualizações recebidas

Quando o app Meet de outro participante recebe uma transmissão, o onGlobalStateChanged() é acionado. Normalmente, é importante tomar boas decisões ações a serem tomadas em resposta a atualizações recebidas, como corresponder somente carimbos de data/hora do vídeo se forem suficientemente diferentes do carimbo de data/hora local.

O exemplo de código a seguir mostra como processar as diferentes atualizações recebidas:

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