Configurar um cliente Android básico
Este tutorial irá guiá-lo pelas etapas de configuração de um cliente Android básico que utiliza a Video API da Vonage.
Visão geral
Todas as aplicações que utilizam a Video API da Vonage exigem tanto um cliente e um servidor componente. O código do lado do cliente é o que é carregado no dispositivo do usuário final (celular, computador) e lida com a maior parte das funcionalidades do OpenTok, incluindo conectando para o sessão, publicação áudio e vídeo correntes para a sessão, e assinando para os fluxos de outros clientes. Para obter mais informações sobre clientes, servidores e sessões, consulte Noções básicas sobre a Video API.
Neste tutorial, você utilizará o SDK do OpenTok para Android, a biblioteca do lado do cliente da OpenTok para dispositivos Android, para criar de forma rápida e fácil um aplicativo de vídeo interativo em tempo real.
Aqui estão os tópicos que serão abordados neste tutorial:
- Requisitos
- Etapa 1: Criação de um novo projeto
- Etapa 2: Adicionando o SDK do OpenTok para Android
- Etapa 3: Configuração da autenticação
- Etapa 4: Solicitação de permissões
- Etapa 5: Conectando-se à sessão
- Etapa 6: Ajustando a interface do usuário do aplicativo de exemplo
- Etapa 7: Publicação de um fluxo na sessão
- Etapa 8: Assinatura de outros fluxos de clientes
- Etapa 9: Executando o aplicativo
- Próximos passos
- Configurando seu servidor
Tempo estimado de conclusão: 25 minutos
Quer pular este tutorial? Você pode acessar o código completo do cliente Android no Básico-Bate-Papo-por-Vídeo-em-Java pasta da nossa Repositório de aplicativos de exemplo para Android no GitHub. O repositório inclui um arquivo README com documentação sobre como executar e explorar o código. Além disso, este tutorial aborda a versão em Java do aplicativo de exemplo do Android. Para uma versão em Kotlin com documentação, consulte o Repositório de aplicativos de exemplo para Android.
Requisitos
Para concluir este tutorial, você precisará de:
- Um account válido da Video API da Vonage — caso você não tenha um account, pode inscreva-se para um teste gratuito
- Android Studio
Etapa 1: Criação de um novo projeto
-
Abra o Android Studio e selecione Novo projeto do Arquivo menu.
-
Defina o SDK mínimo do aplicativo como API 16 (Android 4.1, Jelly Bean).
-
Siga as etapas do assistente, certificando-se de que Atividade vazia está selecionado. Deixe o Nome da atividade definir como
MainActivity, e deixe o Nome do layout definir comoactivity_main.
Etapa 2: Adicionando o SDK do OpenTok para Android
O aplicativo usa o Maven para carregar o SDK do OpenTok para Android:
-
Edite o arquivo build.gradle do seu projeto (na raiz do projeto) e adicione o seguinte trecho de código ao
allprojects/repositoriesseção:mavenCentral()Neste momento, o arquivo build.gradle deve estar assim:
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:4.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() mavenCentral() } } task clean(type: Delete) { delete rootProject.buildDir } -
Modifique o arquivo build.gradle do seu módulo (o arquivo app/build.gradle) e adicione o seguinte trecho de código à seção de dependências:
implementation 'com.opentok.android:opentok-android-sdk:2.22.0'Ao usar o OpenTok para Android versão 2.16.0 ou superior, você precisará adicionar o seguinte ao
androidseção do arquivo build.gradle do aplicativo também:compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }Neste momento, o arquivo build.gradle do seu módulo deve estar assim:
apply plugin: 'com.android.application' android { compileSdkVersion 32 defaultConfig { applicationId "com.example.myapplication" minSdkVersion 16 targetSdkVersion 32 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.annotation:annotation:1.1.0' implementation 'com.opentok.android:opentok-android-sdk:2.22.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' } -
Sincronize seu projeto.
Etapa 3: Configuração da autenticação
Para se conectar a uma sessão do OpenTok, o cliente precisará ter acesso a algumas credenciais de autenticação — um Chave de API, ID da sessão, e token. Em um aplicativo de produção, essas credenciais devem ser geradas por um servidor, mas, para agilizar o processo, vamos simplesmente definir os valores manualmente por enquanto:
-
Crie o
OpenTokConfigclasse (Arquivo | Novo | Classe Java), adicione algumas variáveis estáticas para armazenar a chave da API, o ID da sessão e o token. Também adicionaremos algumas constantes para o identificador da mensagem de log e as permissões:public class OpenTokConfig { public static final String API_KEY = ""; public static final String SESSION_ID = ""; public static final String TOKEN = ""; } -
Ajuste o código definindo os valores de forma estática para o
API_KEY,SESSION_IDeTOKEN.Para fazer isso, faça login na sua Account da Video API, crie um novo projeto da API do OpenTok ou use um projeto existente da API do OpenTok; em seguida, acesse a página do seu projeto e role a tela para baixo até a Ferramentas do projeto seção. A partir daí, você pode gerar manualmente um ID de sessão e um token. Use a chave de API do projeto juntamente com o ID de sessão e o token que você gerou.
Importante: Você pode continuar obtendo os valores do ID da sessão e do token da sua Account durante os testes e o desenvolvimento, mas, antes de entrar em produção, é necessário configurar um servidor. Abordaremos esse assunto em Próximos passos no final deste tutorial.
Para obter mais informações sobre sessões, tokens e servidores, consulte Noções básicas sobre a Video API.
Etapa 4: Solicitação de permissões
Como nosso aplicativo utiliza áudio e vídeo do dispositivo do usuário, precisaremos adicionar um código para solicitar permissões de áudio e vídeo. Vamos usar o EasyPermissions biblioteca para fazer isso.
-
Comece adicionando a biblioteca EasyPermissions ao seu projeto — abra o build.gradle no seu módulo (o arquivo app/build.gradle) e adicione o seguinte trecho de código à seção de dependências:
implementation 'pub.devrel:easypermissions:3.0.0' -
No seu AndroidManifest.xml arquivo, adicione este trecho de código dentro do
manifesttags:<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.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> -
No seu MainActivity.java arquivo, adicione um novo método chamado
onRequestPermissionsResult:@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); }Este é um código padrão para utilizar a biblioteca EasyPermissions.
Importante: Você terá que adicionar as importações manualmente, clicando em EasyPermissions (texto em vermelho) e pressionando a combinação de teclas Option + Enter no macOS ou Alt + Enter no Windows. Essa etapa pode ser necessária ao colar o código. Você também pode ativar a opção “Adicionar importações inequívocas dinamicamente” (Preferências | Editor | Importação automática) para adicionar importações automaticamente.
-
Adicione o
PERMISSIONS_REQUEST_CODEpropriedade no topo do MainActivity.java arquivo:private static final int PERMISSIONS_REQUEST_CODE = 124; -
A seguir, vamos adicionar um
requestPermissions()método:@AfterPermissionGranted(PERMISSIONS_REQUEST_CODE) private void requestPermissions() { String[] perms = { Manifest.permission.INTERNET, Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO }; if (EasyPermissions.hasPermissions(this, perms)) { // initialize and connect to the session } else { EasyPermissions.requestPermissions(this, "This app needs access to your camera and mic to make video calls", PERMISSIONS_REQUEST_CODE, perms); } }Isso verifica se as permissões já foram concedidas. Caso contrário, solicitamos ao usuário as permissões de acesso à câmera e ao microfone por meio do
EasyPermissions.requestPermissionsmétodo.Assim que as permissões forem concedidas, esse método será acionado novamente devido ao
@AfterPermissionGranted(PERMISSIONS_REQUEST_CODE)anotação. Adicionaremos um código para inicializar os objetos de sessão e de visualização nas próximas etapas. -
Agora adicione
requestPermission();para chamar o método dentro doonCreate()método:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestPermissions(); }
Etapa 5: Conectando-se à sessão
A seguir, vamos nos conectar à sessão do OpenTok. É necessário fazer isso antes de poder publicar seu fluxo de áudio e vídeo na sessão ou visualizar os fluxos dos outros participantes.
-
Adicione um
sessionpropriedade à classe MainActivity (logo após as últimas linhas que você adicionou em Etapa 3):private Session session;A classe Session está definida no SDK do OpenTok para Android. Ela representa uma sessão do OpenTok e inclui métodos para interagir com a sessão.
-
Para facilitar o registro em log, adicione um
TAGpropriedade no topo doMainActivityclasse:private static final String TAG = MainActivity.class.getSimpleName(); -
No
requestPermissions()método que você criou na etapa anterior, adicione as seguintes linhas de código abaixo do// initialize and connect to the sessioncomentário para instanciar o objeto Session e chamar seuconnect(token)método:initializeSession(OpenTokConfig.API_KEY, OpenTokConfig.SESSION_ID, OpenTokConfig.TOKEN); -
Logo abaixo do
requestPermissions()método, adicione as seguintes linhas de código:private void initializeSession(String apiKey, String sessionId, String token) { Log.i(TAG, "apiKey: " + apiKey); Log.i(TAG, "sessionId: " + sessionId); Log.i(TAG, "token: " + token); session = new Session.Builder(this, apiKey, sessionId).build(); session.setSessionListener(sessionListener); session.connect(token); }Este código utiliza o
Session.Builder()para instanciar um objeto Session. O construtor recebe três parâmetros:- O contexto do aplicativo Android associado a este processo
- A chave da API do OpenTok
- O ID da sessão
O
Session.Builder.build()O método retorna uma nova instância de Session.O
Session.setSessionListener()O método define o objeto que implementará a interface SessionListener. Essa interface inclui métodos de retorno de chamada que são acionados em resposta a eventos relacionados à sessão. (Vamos implementá-los nas próximas etapas).O
Session.connect()método dosessionO objeto conecta o aplicativo cliente à sessão do OpenTok. É necessário estabelecer a conexão antes de enviar ou receber fluxos de áudio e vídeo na sessão (ou antes de interagir com a sessão de qualquer forma). Oconnect()O método recebe um parâmetro: o token de autenticação para que este cliente se conecte à sessão do OpenTok. -
A seguir, vamos criar o
sessionListenerpropriedade. Adicione o código a seguir no início do arquivoMainActivityclasse:private Session.SessionListener sessionListener = new Session.SessionListener() { @Override public void onConnected(Session session) { Log.d(TAG, "onConnected: Connected to session: " + session.getSessionId()); } @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()); } @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(TAG, "Session error: " + opentokError.getMessage()); } };-
Quando o cliente se conecta à sessão do OpenTok, a implementação do
SessionListener.onConnected(session)o método é chamado. -
Quando o cliente se desconecta da sessão do OpenTok, a implementação do
SessionListener.onDisconnected(session)o método é chamado. -
Se o cliente não conseguir se conectar à sessão do OpenTok, a implementação do
SessionListener.onError(session, error)o método é chamado. -
Quando outro cliente publica um stream na sessão do OpenTok, a implementação do
SessionListener.onStreamReceived(session, stream)o método é chamado. -
Quando outro cliente interrompe a transmissão de um stream para a sessão do OpenTok, a implementação do
SessionListener.onStreamDropped(session, stream)o método é chamado.
Por enquanto, o aplicativo exibe mensagens no console do depurador sempre que algum desses eventos ocorre.
-
Faça a depuração do seu aplicativo. Se o aplicativo se conectar com sucesso à sessão do OpenTok, o SessionListener.onConnected(session) O método registra mensagens no console de depuração.
-
Adicione os métodos abaixo ao
MainActivityclasse para notificar a sessão sobre os eventos do ciclo de vida da Activity:@Override protected void onPause() { super.onPause(); if (session != null) { session.onPause(); } } @Override protected void onResume() { super.onResume(); if (session != null) { session.onResume(); } }
Etapa 6: Ajustando a interface do usuário do aplicativo de exemplo
O SDK do OpenTok para Android expõe os vídeos que você publica e dos quais você se inscreve como objetos `View`. Você pode adicioná-los como filhos de ViewGroup objetos no seu aplicativo. Este aplicativo de exemplo utilizará FrameLayout objetos (que estendem ViewGroup) como contêineres para as visualizações do editor e do assinante:
-
No Android Studio, abra o arquivo app/res/layout/activity_main.xml. Clique na guia “Texto”, na parte inferior do editor, para exibir o código XML do arquivo.
-
Substitua o conteúdo do arquivo pelo código a seguir:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <FrameLayout android:id="@+id/subscriber_container" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <FrameLayout android:id="@+id/publisher_container" android:layout_width="90dp" android:layout_height="120dp" android:layout_gravity="bottom|end" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:layout_marginBottom="16dp" android:background="#CCCCCC" android:padding="2dp" /> </FrameLayout> </androidx.constraintlayout.widget.ConstraintLayout>Certifique-se de substituir todo o conteúdo do
<TextView>elemento (por meio da tag de fechamento/>(tag). -
Agora declare
publisherViewContaineresubscriberViewContainercomo propriedades da classe MainActivity (logo após a declaração dasessionpropriedade):private FrameLayout publisherViewContainer; private FrameLayout subscriberViewContainer; -
Por fim, no atual
onCreate()método, inicialize esses objetos de visualização de layout adicionando as seguintes linhas de código abaixo dosetContentView()chamada de método:publisherViewContainer = findViewById(R.id.publisher_container); subscriberViewContainer = findViewById(R.id.subscriber_container);Neste momento, o seu
onCreate()O método deve ficar assim:Copiar@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); publisherViewContainer = findViewById(R.id.publisher_container); subscriberViewContainer = findViewById(R.id.subscriber_container); requestPermissions(); }
As etapas acima servem apenas para configurar um layout de exemplo para este aplicativo. Seu próprio aplicativo pode adicionar visualizações de editor e assinante como elementos filhos de outras ViewGroup objetos
Etapa 7: Publicação de um fluxo na sessão
Quando o aplicativo se conectar à sessão do OpenTok, queremos que ele transmita um fluxo de áudio e vídeo para a sessão, usando a câmera e o microfone:
-
Adicione um
publisherpropriedade à classe MainActivity (após a declaração dasessionpropriedade):private Publisher publisher;A classe Publisher está definida no SDK do OpenTok para Android.
-
Modificar a implementação do
SessionListener.onConnected()método para incluir código para publicar um stream na sessão:@Override public void onConnected(Session session) { Log.d(TAG, "onConnected: Connected to session: " + session.getSessionId()); publisher = new Publisher.Builder(MainActivity.this).build(); publisher.setPublisherListener(publisherListener); publisher.getRenderer().setStyle(BaseVideoRenderer.STYLE_VIDEO_SCALE, BaseVideoRenderer.STYLE_VIDEO_FILL); publisherViewContainer.addView(publisher.getView()); if (publisher.getView() instanceof GLSurfaceView) { ((GLSurfaceView) publisher.getView()).setZOrderOnTop(true); } session.publish(publisher); }O código acima utiliza
Publisher.Builder()para instanciar um objeto Publisher. O construtor recebe um parâmetro: o contexto associado a este processo (embora possa ser diferente em um aplicativo de produção).O
Publisher.setPublisherListener()O método define o objeto que implementará a interface PublisherListener. Essa interface inclui métodos de retorno de chamada que são acionados em resposta a eventos relacionados ao editor.Importante: O contexto utilizado depende do caso de uso específico. No entanto, geralmente é preferível que a sessão permaneça fora da Activity (por exemplo, entre atividades). Para Applications em produção, é mais prático usar o contexto do aplicativo em vez do contexto da atividade.
Em seguida, o código passa o objeto Publisher como parâmetro da função
Session.publish()método. Esse método transmite um fluxo de áudio e vídeo para a sessão do OpenTok, utilizando a câmera e o microfone do dispositivo Android. (Observe que, em um dispositivo virtual Android, o SDK do OpenTok para Android utiliza um vídeo de teste ao transmitir um fluxo).O objeto Publisher possui um
getView()retorna um objeto View do Android. Essa view exibe o vídeo capturado pela câmera do dispositivo. O código adiciona essa view como uma subview dapublisherViewContainerobjeto. -
Para registrar eventos, adicione um
publisherListenerpropriedade para osessionListenerdoMainActivity: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(TAG, "PublisherKit onError: " + opentokError.getMessage()); } };Observe que a classe `Publisher` estende a classe `PublisherKit` (também definida pelo SDK do OpenTok para Android). A classe `PublisherKit` é uma classe base que você pode usar para criar emissores avançados (como aqueles que utilizam capturadores ou renderizadores de vídeo personalizados).
Isso implementa o PublisherListener métodos:
-
onStreamCreated(publisherKit, stream)— É chamado quando o emissor inicia a transmissão para a sessão do OpenTok. -
onStreamDestroyed(publisherKit, stream)— É chamado quando o emissor interrompe a transmissão para a sessão do OpenTok. -
onError(error)— É chamado quando o cliente não consegue publicar na sessão do OpenTok. UmOpentokErroro objeto é passado para o método.
Etapa 8: Assinatura de outros fluxos de clientes
Queremos que os clientes possam inscrever-se para (ou visualizar) as transmissões de outros clientes na sessão:
-
Adicione um
subscriberpropriedade à classe MainActivity (após a declaração dapublisherpropriedade):private Subscriber subscriber;A classe `Subscriber` está definida no SDK do OpenTok para Android. Ela define um objeto que um cliente utiliza para se inscrever (visualizar) um stream publicado por outro cliente.
-
Modificar a implementação do
onStreamReceived(session, stream)método (uma das chamadas de retorno do SessionListener) para incluir código que permita assinar os fluxos de outros clientes na sessão:@Override public void onStreamReceived(Session session, Stream stream) { Log.d(TAG, "onStreamReceived: New Stream Received " + stream.getStreamId() + " in session: " + session.getSessionId()); if (subscriber == null) { subscriber = new Subscriber.Builder(MainActivity.this, stream).build(); subscriber.getRenderer().setStyle(BaseVideoRenderer.STYLE_VIDEO_SCALE, BaseVideoRenderer.STYLE_VIDEO_FILL); subscriber.setSubscriberListener(subscriberListener); session.subscribe(subscriber); subscriberViewContainer.addView(subscriber.getView()); } } -
Para registrar eventos, adicione
subscriberListenerimóvel logo abaixosessionListenerdoMainActivity: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(TAG, "SubscriberKit onError: " + opentokError.getMessage()); } };
Quando outro cliente publica um fluxo em uma sessão, esse método é chamado e um objeto `Stream` é passado como parâmetro. A classe `Stream` está definida no SDK do OpenTok para Android e representa um fluxo de áudio e vídeo na sessão do OpenTok.
O código inicializa uma instância da classe Subscriber, definida no SDK do OpenTok para Android. O Subscriber.Builder() O construtor recebe dois parâmetros:
-
O contexto do aplicativo Android associado a este processo.
-
O objeto Stream (correspondente ao stream que você deseja visualizar)
O Session.subscribe(subscriber) O método assina o fluxo que acabou de ser recebido.
subscriberViewContainer.addView(subscriber.getView()) exibe a visualização do novo stream assinado na tela.
-
Modificar a implementação do
onStreamDropped(Session session, Stream stream)método (mais um dos callbacks do SessionListener):@Override public void onStreamDropped(Session session, Stream stream) { Log.i(TAG, "Stream Dropped"); if (subscriber != null) { subscriber = null; subscriberViewContainer.removeAllViews(); } }subscriberViewContainer.removeAllViews()remove a visualização de um assinante assim que a transmissão for interrompida.
Etapa 9: Executando o aplicativo
Agora que seu código está pronto, você pode executar o aplicativo no emulador do Android Studio. Isso criará um vídeo simulado do editor — como o emulador não tem acesso à sua webcam, o vídeo do editor exibirá um gráfico animado em vez da imagem da sua câmera.
Para adicionar um segundo editor (que aparecerá como assinante no seu emulador), execute o aplicativo uma segunda vez em um dispositivo Android conectado ou use o OpenTok Playground para se conectar à sessão em um navegador compatível, seguindo as etapas abaixo:
-
Acesse OpenTok Playground (é necessário estar conectado à sua Account)
-
Selecione o Participar de uma sessão já em andamento aba
-
Copie o ID da sessão que você usou no arquivo MainActivity.java e cole-o em ID da sessão campo de entrada
-
Clique Participar da sessão
-
Na próxima tela, clique em Conectar-se, em seguida, clique em Publicar transmissão
-
Você pode ajustar as opções do Publisher (opcional) e, em seguida, clicar em Continuar para se conectar e começar a publicar e se inscrever
Neste momento, você deve ver a transmissão da sua webcam, bem como a transmissão do emulador. Voltando ao emulador, você também deve ver o novo editor exibido na tela emulada.

Parabéns! Você concluiu o tutorial “Configurar um cliente Android básico”.
Você pode continuar experimentando e ajustando o código que desenvolveu aqui para o lado do cliente do seu aplicativo, mas lembre-se de que precisará implementar o componente de servidor da sua aplicação antes de entrar em produção (consulte Configurando seu servidor (abaixo).
Você pode visualizar uma versão completa deste aplicativo de exemplo no Básico-Bate-Papo-por-Vídeo-em-Java pasta do exemplos-do-SDK-de-vídeo-da-Vonage-para-Android repositório no GitHub. Esta versão finalizada inclui código para carregar o ID da sessão, o token e a chave de API a partir de um serviço web (em vez de usar valores fixos).
Próximos passos
Quando terminar esta seção, continue desenvolvendo e aprimorando seu aplicativo OpenTok com estes recursos úteis:
- Configure seu servidor — Antes de entrar em produção, você precisará configurar um servidor para gerar credenciais
- Noções básicas sobre a Video API — Se ainda não o fez, reserve alguns minutos para aprender exatamente como o OpenTok funciona
- Exemplos de código — uma coleção de aplicativos de exemplo que exploram diversos recursos e casos de uso do OpenTok
- Guias para desenvolvedores — documentação detalhada sobre todos os recursos e funcionalidades do OpenTok
- Tutoriais adicionais — guias passo a passo para a implementação de outros recursos e casos de uso do OpenTok
- Referência do SDK do Android — explore os métodos e eventos associados ao SDK do OpenTok para Android
Configurando seu servidor
No tutorial acima, pedimos que você codificar diretamente suas credenciais de autenticação. No entanto, para um aplicativo de produção, o sessionId e token Os valores no seu código devem ser gerados pelo servidor de aplicativos e repassados ao cliente. Aqui estão algumas razões pelas quais você não deve usar credenciais codificadas diretamente no código-fonte do seu aplicativo de produção:
- Os tokens expiram após um determinado período (especificado no momento da geração); portanto, é necessário gerar novos tokens regularmente
- Você não poderá criar novas sessões dinamicamente; portanto, todos os usuários do seu aplicativo ficariam restritos a uma única “sala”
Você pode continuar testando seu aplicativo com valores codificados diretamente, mas, quando estiver pronto para configurar um servidor, há várias maneiras de fazer isso:
Opção 1 do servidor — Inicie um servidor REST simples no Heroku com um clique
Essa é provavelmente a maneira mais rápida de colocar um servidor em funcionamento, mas sua funcionalidade é limitada. Basta clicar no botão do Heroku abaixo; você será redirecionado para o site do Heroku e solicitado a inserir sua chave de API e seu segredo de API do OpenTok — você pode obter esses valores na página do seu projeto em seu Account da Video API. Se você não tiver um Account no Heroku, precisará se cadastrar (é grátis).
Quer dar uma olhada no código? O botão acima executa o código do servidor a partir do aprendendo-opentok-php Repositório do GitHub. Acesse o repositório para revisar o código e consultar a documentação adicional — você pode até mesmo criar um fork do repositório e fazer alterações antes da implantação.
Prefere o Node.js? Visite o aprendendo-opentok-node repositório com a mesma funcionalidade usando Node.js (incluindo um botão de implantação no Heroku).
Depois que o servidor estiver implantado no Heroku, você precisará adicionar um código ao seu projeto para obter as credenciais do servidor. Confira a implementação do cliente no Básico-Bate-Papo-por-Vídeo-em-Java / Básico-Bate-papo-por-Vídeo-Kotlin projeto.
Opção 2 do servidor — Compilar do zero usando os SDKs do servidor
A Opção 1 utiliza endpoints REST para transmitir credenciais ao cliente, mas essa é apenas uma das muitas maneiras de implementar um servidor com o OpenTok. Se você deseja um nível maior de personalização, pode consultar o Documentação do SDK do servidor para a linguagem do lado do servidor de sua escolha (disponível para PHP, Node.js, Java, .NET, Python e Ruby). A documentação aborda o processo de configuração e os diversos métodos necessários para gerar sessões e tokens, além de outras funcionalidades do lado do servidor.