Guia de migração do Twilio (Android)
Este guia explica como migrar sua implementação atual do Twilio Video para o SDK do Vonage Video. A Vonage oferece duas maneiras de começar: a Vonage’s Video API.
Visão geral
As Video APIs do Twilio e do Vonage têm conceitos muito semelhantes. Este guia introdutório tem como objetivo ajudá-lo a migrar seu aplicativo de vídeo.
A principal diferença é que, no Twilio, é preciso criar uma sala SID considerando que, no Vonage, você cria um ID da sessão. Em seguida, você cria tokens de autenticação que são usados no lado do cliente para se conectar a salas no Twilio ou a sessões no Vonage.
Os diagramas a seguir detalham as principais diferenças:


Obter credenciais do Video SDK
Criar um Account de desenvolvedor para acessar o portal do desenvolvedor. Para começar a trabalhar com vídeo, você precisa criar um aplicativo. Você pode seguir as criar um aplicativo guia para obter seu ID do aplicativo e chave privada.
Instale o SDK
Substitua a referência ao SDK de vídeo do Twilio no seu arquivo Gradle (build.gradle) pelo SDK de vídeo da Vonage.
Assim, a partir de implementation 'com.twilio:video-android:7.5.1' para implementation ‘com.opentok.android:opentok-android-sdk:2.27.0’.
Ativar as permissões necessárias
Caso ainda não tenha feito isso, habilite a seguinte permissão no AndroidManifest.xml arquivo:
...
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
</manifest>
Autenticação
O SDK de vídeo da Vonage utiliza tokens para autenticar usuários. Ao gerar um token, é possível definir a função do usuário (assinante, editor ou moderador). Opcionalmente, também é possível atribuir uma sequência de metadados ao token (ou seja, para identificar o cliente conectado). Consulte nosso Artigo: Visão geral da criação de tokens para conhecer as opções que você pode usar ao gerar tokens. Os tokens são gerados no lado do servidor e enviados para o lado do cliente. Acesse o Guias dos SDKs do lado do servidor para saber mais.
Criar uma sessão de vídeo
A sessão é como um sala, clientes com o mesmo ID da sessão poderão se comunicar entre si. Como fichas, sessões são criados no lado do servidor.
Consulte nosso Criação de uma sessão guia para saber mais e conhecer as diversas opções de configuração disponíveis.
Para criar uma sessão e gerar um token, use uma de nossas SDKs de servidor.
Conectar-se a uma sessão de vídeo
Para conectar um endpoint de cliente a uma sessão do Vonage Video, é necessário um ID de aplicativo, um ID de sessão e um token.
Essas credenciais podem ser obtidas no Painel de controle e codificado diretamente no aplicativo para fins de desenvolvimento; no entanto, em um ambiente de produção, utilize os SDKs do servidor para fornecer o ID da sessão e o token (consulte Bate-papo por vídeo básico projeto).
Mapeamento de terminologia entre Twilio e Vonage
| Twilio | Vonage |
|---|---|
| Room | Session |
| Participants | Subscriber(s) + Publisher(s) |
| Tracks | Stream |
| RemoteTracks | Subscribers(s).stream |
| LocalTracks | Publisher(s).stream |
Conectando-se a uma sessão de vídeo
A conexão e o gerenciamento de fluxos de vídeo são realizados por meio de um manipulador de eventos.
Existem três ouvintes de eventos principais que você precisa implementar:
- Session.SessionListener (
private Session mSession;) - PublisherKit.PublisherListener (
private Publisher mPublisher;) - SubscriberKit.SubscriberListener (
private Subscriber mSubscriber;)
SessionListener
O Session.SessionListener Esses métodos são utilizados para lidar com eventos relacionados à adição e remoção de participantes (assinantes e editores).
Isso equivale ao da Twilio Room.Listener manipulador de eventos.
A seguir, está a estrutura do exposto SessionListener interface:
private Session.SessionListener sessionListener = new Session.SessionListener() {
@Override
public void onConnected(Session session) {
Log.d(TAG, "onConnected: Connected to session: " + session.getSessionId());
mPublisher = new Publisher.Builder(MainActivity.this).build();
mPublisher.setPublisherListener(publisherListener);
mSession.publish(mPublisher);
}
@Override
public void onDisconnected(Session session) {
Log.d(TAG, "onDisconnected: Disconnected from session: " + session.getSessionId());
}
@Override
public void onStreamReceived(Session session, Stream stream) {
Log.d(TAG, "onStreamReceived: New Stream Received " + stream.getStreamId() + " in session: " + session.getSessionId());
mSubscriber = new Subscriber.Builder(MainActivity.this, stream).build();
mSubscriber.setSubscriberListener(subscriberListener);
mSession.subscribe(mSubscriber);
}
@Override
public void onStreamDropped(Session session, Stream stream) {
Log.d(TAG, "onStreamDropped: Stream Dropped: " + stream.getStreamId() + " in session: " + session.getSessionId());
}
@Override
public void onError(Session session, OpentokError opentokError) {
Log.e("Session error: " + opentokError.getMessage());
}
};
PublisherListener
O PublisherKit.PublisherListener é usado para implementar a lógica a ser executada com base nos fluxos de criação e de encerramento.
A seguir, está a estrutura do exposto PublisherListener interface:
private PublisherKit.PublisherListener publisherListener = new PublisherKit.PublisherListener() {
@Override
public void onStreamCreated(PublisherKit publisherKit, Stream stream) {
Log.d(TAG, "onStreamCreated: Publisher Stream Created. Own stream " + stream.getStreamId());
}
@Override
public void onStreamDestroyed(PublisherKit publisherKit, Stream stream) {
Log.d(TAG, "onStreamDestroyed: Publisher Stream Destroyed. Own stream " + stream.getStreamId());
}
@Override
public void onError(PublisherKit publisherKit, OpentokError opentokError) {
Log.e("PublisherKit onError: " + opentokError.getMessage());
}
};
SubscriberListener
O SubscriberKit.SubscriberListener é usado para implementar a lógica a ser executada quando um assinante entra em um fluxo.
A seguir, está a estrutura do exposto SubscriberListener interface:
SubscriberKit.SubscriberListener subscriberListener = new SubscriberKit.SubscriberListener() {
@Override
public void onConnected(SubscriberKit subscriberKit) {
Log.d(TAG, "onConnected: Subscriber connected. Stream: " + subscriberKit.getStream().getStreamId());
}
@Override
public void onDisconnected(SubscriberKit subscriberKit) {
Log.d(TAG, "onDisconnected: Subscriber disconnected. Stream: " + subscriberKit.getStream().getStreamId());
}
@Override
public void onError(SubscriberKit subscriberKit, OpentokError opentokError) {
Log.e("SubscriberKit onError: " + opentokError.getMessage());
}
};
Conectando-se a uma sessão
Você vai precisar do seu APP_ID , SESSION_ID para se conectar a uma transmissão de vídeo.
A TOKEN Também é necessário indicar a transmissão à qual você deseja participar.
Twilio
private Room room;
ConnectOptions.Builder connectOptionsBuilder =
new ConnectOptions.Builder(accessToken).roomName(roomName);
room = Video.connect(this, connectOptionsBuilder.build(), roomListener());
Vonage
Session.Builder builder = new Session.Builder(this, APP_ID, SESSION_ID);
mSession = builder.build();
mSession.setSessionListener(sessionListener);
mSession.connect(TOKEN);
Publicação de vídeo
Os SDKs de vídeo da Vonage ajustam automaticamente a qualidade do vídeo, com base nas condições da rede e nas capacidades do dispositivo.
Dito isso, você pode configurar certas propriedades, como resolução, taxa de quadros, e opção alternativa de áudio. Um único objeto publisher pode lidar tanto com áudio quanto com vídeo. É possível controlar seletivamente o áudio ou o vídeo usando os métodos disponíveis no objeto publisher.
Adicionar editora
Twilio:
localVideoTrack = LocalVideoTrack.create(this, true, cameraCapturerCompat, LOCAL_VIDEO_TRACK_NAME);
Vonage:
Session.SessionListener() {
@Override
public void onConnected(Session session) {
Log.d(TAG, "onConnected: Connected to session: " + session.getSessionId());
mPublisher = new Publisher.Builder(MainActivity.this).build();
mPublisher.setPublisherListener(publisherListener);
mSession.publish(mPublisher);
}
}
Apenas trilha de áudio
Twilio
localVideoTrack =
LocalVideoTrack.create(this, false, cameraCapturerCompat, LOCAL_VIDEO_TRACK_NAME);
Vonage:
mPublisher = new Publisher.Builder(this).name(mUsername)
.videoTrack(false)
.build();
Apenas a faixa de vídeo
Twilio:
localAudioTrack = LocalAudioTrack.create(this, false, LOCAL_AUDIO_TRACK_NAME);
Vonage:
mPublisher = new Publisher.Builder(this).name(mUsername)
.audioTrack(false)
.build();
Retirar da publicação da sessão
Twilio:
localParticipant.unpublishTrack(localVideoTrack);
Vonage:
mSession.unpublish(mPublisher);
Silenciar o áudio do Publisher
Twilio:
localAudioTrack.enable(false);
Vonage:
mPublisher.setPublishAudio(false);
Ativar o áudio do Publisher
Twilio:
localAudioTrack.enable(true);
Vonage:
mPublisher.setPublishAudio(true);
Silenciar o vídeo do editor
Twilio:
localVideoTrack.enable(false);
Vonage:
mPublisher.setPublishVideo(false);
Ativar o som do vídeo do editor
Twilio:
localVideoTrack.enable(true);
Vonage:
mPublisher.setPublishVideo(true);
Inscreva-se em um canal
Quando um participante remoto (assinante) se conecta a uma sessão, o Session.SessionListener.onStreamReceived() A função de retorno de chamada é invocada com o objeto de fluxo correspondente.
Twilio:
@Override
public void onConnected(Room room) {
localParticipant = room.getLocalParticipant();
setTitle(room.getName());
for (RemoteParticipant remoteParticipant : room.getRemoteParticipants()) {
addRemoteParticipant(remoteParticipant);
break;
}
}
Vonage:
@Override
public void onStreamReceived(Session session, Stream stream) {
Log.d(TAG, "onStreamReceived: New Stream Received " + stream.getStreamId() + " in session: " + session.getSessionId());
mSubscriber = new Subscriber.Builder(MainActivity.this, stream).build();
mSubscriber.setSubscriberListener(subscriberListener);
mSession.subscribe(mSubscriber);
}
Desconectando-se de uma sessão
Twilio:
room.disconnect()
Vonage:
mSession.disconnect()
Métodos onPause() e onResume()
Vonage:
@Override
protected void onPause() {
super.onPause();
if (mSession != null) {
mSession.onPause();
}
}
@Override
protected void onResume() {
super.onResume();
if (mSession != null) {
mSession.onResume();
}
}
Idealmente onPause() e onResume() deveria ser implementado no MainActivity Aula.
Compartilhamento de tela
Um aplicativo de exemplo para compartilhamento de tela.
Aplicativo de bate-papo por texto
Um aplicativo de exemplo para envio de mensagem de texto.
Mais informações
- Exemplo Gradle arquivo.
- Exemplos de aplicações em Aplicativos de exemplo para Android.
- Melhores práticas para a criação de aplicativos de vídeo.
- SDK do Android para a Video API da Vonage
- SDKs do lado do servidor