Reprodução de anúncios personalizados com o SDK do IMA para Android

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.