Exemplo de código Android para compartilhamento de tela
Visão geral
Este guia mostra como usar o SDK do Android para publicar um vídeo de compartilhamento de tela.
Configurando seu projeto
O código desta seção está disponível no projeto Screen-Sharing-Java do exemplos-do-opentok-android-sdk repositório. Caso ainda não tenha feito isso, você precisará clonar o repositório em um diretório local. Na linha de comando, execute:
Abra o Compartilhamento de tela - Java projeto no Android Studio para acompanhar.
Importante: Observe que o seu ID do aplicativo é o seu Chave de API.
Explorando o código
O MainActivity usos da classe WebView objeto como fonte do vídeo de compartilhamento de tela da transmissão publicada.
No initializePublisher() método do MainActivity Na classe, após criar um objeto Publisher.Builder, o código chama o capturer() método do Publisher.Builder objeto, passando um ScreenSharingCapturer objeto como parâmetro:
ScreenSharingCapturer screenSharingCapturer = new ScreenSharingCapturer(MainActivity.this, webViewContainer);
publisher = new Publisher.Builder(MainActivity.this)
.capturer(screenSharingCapturer)
.build();
ScreenSharingCapturer é uma classe personalizada que estende a BaseVideoCapturer classe (definida no SDK do Vonage Video). Essa classe permite definir um capturador de vídeo personalizado para ser usado por um editor do Vonage Video. O construtor da ScreenSharingCapturer A classe recebe como parâmetro um objeto View do Android, que o capturador utilizará como fonte do vídeo.
O getCaptureSettings() O método inicializa as configurações de captura a serem utilizadas pelo capturador de vídeo personalizado:
@Override
public CaptureSettings getCaptureSettings() {
CaptureSettings captureSettings = new CaptureSettings();
captureSettings.fps = fps;
captureSettings.width = width;
captureSettings.height = height;
captureSettings.format = ARGB;
return captureSettings;
}
O startCapture() O método inicia o frameProducer rosca após 1/15 de segundo:
@Override
public int startCapture() {
capturing = true;
handler.postDelayed(newFrame, 1000 / fps);
return 0;
}
O frameProducer o thread recebe um Bitmap representação do contentViewobjeto (o WebView), grava seus pixels em um buffer e, em seguida, chama a função provideIntArrayFrame() método, passando esse buffer como parâmetro:
private Runnable newFrame = new Runnable() {
@Override
public void run() {
if (capturing) {
int width = contentView.getWidth();
int height = contentView.getHeight();
if (frame == null ||
ScreenSharingCapturer.this.width != width ||
ScreenSharingCapturer.this.height != height) {
ScreenSharingCapturer.this.width = width;
ScreenSharingCapturer.this.height = height;
if (bmp != null) {
bmp.recycle();
bmp = null;
}
bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bmp);
frame = new int[width * height];
}
canvas.saveLayer(0, 0, width, height, null);
canvas.translate(-contentView.getScrollX(), - contentView.getScrollY());
contentView.draw(canvas);
bmp.getPixels(frame, 0, width, 0, 0, width, height);
provideIntArrayFrame(frame, ARGB, width, height, 0, false);
canvas.restore();
handler.postDelayed(newFrame, 1000 / fps);
}
}
};
O provideIntArrayFrame<()/code> método, definido pelo BaseVideoCapturer A classe envia uma matriz de inteiros com dados ao editor, para serem usados no próximo quadro de vídeo publicado.
Se o editor ainda estiver capturando vídeo, o ciclo recomeça após mais 1/15 de segundo, de modo que o capturador continue a fornecer ao editor novos quadros de vídeo para publicação.