No IMA v3.30.0 e em versões anteriores, o SDK do IMA consegue lidar com toda a lógica de reprodução de anúncios, enquanto o app se concentra em reproduzir conteúdo de vídeo. Essa abordagem é chamada "Reprodução de anúncios do SDK".
Se você quiser exibir anúncios no seu player de vídeo, o SDK fornece uma interface para isso. Chamamos essa abordagem de reprodução de anúncios" e o restante deste guia trata da implementação.
Pré-requisitos
- Uma integração básica do IMA.
Recomendamos que você consulte a Exemplo avançado no GitHub como ponto de partida se você ainda não tiver um SDK básico integração total. Este exemplo já implementa a reprodução de anúncios personalizados. O restante deste guia descreverá os recursos necessários para a reprodução de anúncios personalizados com anúncios do IMA.
Interface com VideoAdPlayer
A reprodução de anúncios personalizados exige que seu app implemente a
VideoAdPlayer
interface gráfica do usuário. Essa interface é usada pelo SDK para notificar seu app para reproduzir o anúncio
vídeos. O app também usa essa interface para informar o SDK sobre um anúncio em vídeo importante
eventos. Siga estas etapas para implementar a interface.
Criar um VideoAdPlayer
A primeira etapa é criar uma classe VideoAdPlayer
anônima
em requestAds()
:
private VideoAdPlayer videoAdPlayer;
...
private void requestAds(String adTagUrl) {
videoAdPlayer = new VideoAdPlayer() {
};
}
Adicionar métodos de vídeo
Em seguida, adicione métodos que instruem o player de vídeo a reproduzir, carregar, parar e pausar o anúncio vídeos. Também adicionamos os métodos para liberar o player e ver o volume aqui:
videoAdPlayer = new VideoAdPlayer() {
@Override
public void playAd() {
if (mIsAdDisplayed) {
videoPlayer.resume();
} else {
isAdDisplayed = true;
videoPlayer.play();
}
}
@Override
public void loadAd(String url) {
isAdDisplayed = true;
videoPlayer.setVideoPath(url);
}
@Override
public void stopAd() {
videoPlayer.stopPlayback();
}
@Override
public void pauseAd() {
videoPlayer.pause();
}
@Override
public void release() {
// any clean up that needs to be done
}
@Override
public int getVolume() {
return videoPlayer.getVolume();
}
};
Esses métodos são wrappers compactos em torno dos elementos semelhantes do player métodos. Esses métodos definem uma variável interna que é usada para acompanhar se um anúncio está sendo exibido. Na reprodução de anúncios personalizados, a player de vídeo reproduz anúncios em vídeo e em vídeo de conteúdo, portanto, você precisa ter qual está sendo exibido no momento.
Progresso da reprodução do anúncio
A interface VideoAdPlayer
implementa outra interface,
AdProgressProvider
. Portanto, ela também precisa ser implementada. Ele tem apenas
um método, getAdProgress()
, que é usado pelo SDK para acessar
informações de reprodução de anúncios. Adicionar à sua lista anônima VideoAdPlayer
, abaixo dos outros métodos:
VideoAdPlayer videoAdPlayer = new VideoAdPlayer() {
...
@Override
public VideoProgressUpdate getAdProgress() {
if (!isAdDisplayed || videoPlayer.getDuration() <= 0) {
return VideoProgressUpdate.VIDEO_TIME_NOT_READY;
}
return new VideoProgressUpdate(videoPlayer.getCurrentPosition(),
videoPlayer.getDuration());
}
};
getAdProgress()
retorna um tipo VideoProgressUpdate
, que
deve consistir na posição e duração atuais do vídeo. Se o jogador
não estiver reproduzindo um anúncio ou a duração não estiver disponível, faça com que ele retorne
VideoProgressUpdate.VIDEO_TIME_NOT_READY
, como mostrado no exemplo.
Gerenciar callbacks de vídeo
A reprodução de anúncios personalizados exige que seu app informe o SDK sobre as principais
eventos de vídeo. Do ponto de vista do SDK, são as chamadas de retorno que são
descrito pela interface VideoAdPlayer.VideoAdPlayerCallback
.
Antes de falarmos sobre os métodos de callback, você precisa conhecer
adicionar e remover os callbacks quando solicitado pelo SDK. Isso é
feito dentro de VideoAdPlayer
usando addCallback()
e removeCallback()
:
private List<VideoAdPlayerCallback> adCallbacks = new ArrayList<>(1);
VideoAdPlayer videoAdPlayer = new VideoAdPlayer() {
...
@Override
public void addCallback(VideoAdPlayerCallback videoAdPlayerCallback) {
adCallbacks.add(videoAdPlayerCallback);
}
@Override
public void removeCallback(VideoAdPlayerCallback videoAdPlayerCallback) {
adCallbacks.remove(videoAdPlayerCallback);
}
};
Essa implementação usa um List<>
para os callbacks que serão usados para chamar
os métodos List<>.add()
e remove()
.
Chamar os callbacks
Agora que o SDK tem uma maneira de dizer ao app para adicionar e remover callbacks, definem os locais em que o callback é chamado. Seu app precisa fazer uma chamada esses callbacks quando ocorrerem eventos importantes de vídeo, como reprodução, pausa ou quando um vídeo termina ou apresenta um erro.
Para fazer isso, expanda a SampleVideoPlayer
para que haja um listener dessas
eventos de vídeo adicionados a partir de VideoFragment
. O motivo para tomar
um listener separado em SampleVideoPlayer
para chamar esses callbacks de anúncios.
é que SampleVideoPlayer
não sabe nada sobre anúncios,
Por isso, você precisa encaminhar os eventos de vídeo para algo que possa lidar com anúncios.
public interface OnVideoEventsListener {
void onPlay();
void onResume();
void onPause();
void onError();
}
private final List<OnVideoEventsListener> onVideoEventsListeners = new ArrayList<>(1);
public void addVideoEventsListener(OnVideoEventsListener listener) {
onVideoEventsListeners.add(listener);
}
Iniciar, pausar e retomar
Crie um tipo enumerado para monitorar o estado da reprodução e adicione novas substituições
para os métodos start()
e pause()
em SampleVideoPlayer
:
private enum PlaybackState {
STOPPED, PAUSED, PLAYING
}
private PlaybackState playbackState = PlaybackState.STOPPED;
@Override
public void start() {
super.start();
switch (playbackState) {
case STOPPED:
for (OnVideoEventsListener listener : onVideoEventsListeners) {
listener.onPlay();
}
break;
case PAUSED:
for (OnVideoEventsListener listener : onVideoEventsListeners) {
listener.onResume();
}
break;
default:
// Already playing; do nothing.
break;
}
playbackState = PlaybackState.PLAYING;
}
@Override
public void pause() {
super.pause();
playbackState = PlaybackState.PAUSED;
for (OnVideoEventsListener listener : onVideoEventsListeners) {
listener.onPause();
}
}
Solucionar erros
Substitua o listener de erro anônimo do player de vídeo que você definiu em init()
:
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
playbackState = PlaybackState.STOPPED;
for (OnVideoEventsListener listener : onVideoEventsListeners) {
listener.onError();
}
// Returning true signals to MediaPlayer that the error was handled.
// This prevents the completion handler from being called.
return true;
}
Implementar o listener
Volte para o VideoFragment
e adicione um OnVideoEventsListener
anônimo
à instância SampleVideoPlayer
:
mVideoPlayer.addVideoEventsListener(new OnVideoEventsListener() {
@Override
public void onPlay() {
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onPlay();
}
}
}
@Override
public void onResume() {
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onResume();
}
}
}
@Override
public void onPause() {
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onPause();
}
}
}
@Override
public void onError() {
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onError();
}
}
}
});
Mude o método onVideoCompleted()
do OnVideoCompletedListener
.
para lidar com a conclusão de um anúncio em vídeo:
public void onVideoCompleted() {
// Handle completed event for playing post-rolls.
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onEnded();
}
} else {
if (adsLoader != null) {
adsLoader.contentComplete();
}
}
Alternar entre conteúdo e anúncios
Este exemplo usa a mesma instância do player de vídeo para reproduzir conteúdo e anúncios, então você precisa adicionar alguma lógica para alternar entre conteúdo e anúncios no seu player. Você pode recarregar e buscar a vídeo de conteúdo para voltar ao ponto em que o anúncio começou. Adicionar dois para fazer isso:
private int savedContentPosition = 0;
private void pauseContent() {
savedContentPosition = videoPlayer.getCurrentPosition();
videoPlayer.stopPlayback();
isAdDisplayed = true;
}
private void resumeContent() {
videoPlayer.setVideoPath(getString(R.string.content_url));
videoPlayer.seekTo(mSavedContentPosition);
videoPlayer.play();
isAdDisplayed = false;
}
Eles são chamados quando os métodos CONTENT_PAUSE_REQUESTED
e
CONTENT_RESUME_REQUESTED
eventos foram recebidos, em
VideoFragment.onAdEvent()
, respectivamente:
case CONTENT_PAUSE_REQUESTED:
pauseContent();
break;
case CONTENT_RESUME_REQUESTED:
resumeContent();
break;
Ativar a reprodução de anúncios personalizados
A última etapa é informar ao SDK que você está usando a reprodução de anúncios personalizados.
Para fazer isso, transmita um VideoAdPlayer
para o AdDisplayContainer
:
adDisplayContainer.setPlayer(videoAdPlayer);
É necessário transmitir o player para o setPlayer()
. Caso contrário, o
O SDK usa a reprodução de propriedade do SDK.
É isso. Essas são todas as etapas necessárias para adicionar a reprodução de anúncios personalizados aos seus implementação do IMA. Você pode comparar sua própria implementação com a Exemplo avançado no GitHub se você tiver problemas.