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:
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 diferentes o suficiente 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();
}
}
}