In IMA 3.30.0 e versioni precedenti, l'SDK IMA è in grado di gestire tutta la logica di riproduzione degli annunci, mentre l'app si concentra sulla riproduzione dei contenuti video. Questo approccio è chiamato "Riproduzione dell'annuncio di proprietà dell'SDK".
Se vuoi riprodurre annunci nel video player, l'SDK fornisce un'interfaccia. Questo approccio viene chiamato "personalizzato "Riproduzione dell'annuncio" e il resto di questa guida ne descrive l'implementazione.
Prerequisiti
- Un'integrazione IMA di base.
Ti consigliamo di consultare le Esempio avanzato su GitHub come punto di partenza se al momento non disponi di un IMA di base e integrazione. In questo esempio viene già implementata la riproduzione di annunci personalizzati. Il resto di questa guida verranno descritte le funzionalità necessarie per la riproduzione di annunci personalizzati con annunci IMA.
Interfaccia con VideoAdPlayer
La riproduzione di annunci personalizzati richiede che l'app implementi il metodo
VideoAdPlayer
a riga di comando. Questa interfaccia viene utilizzata dall'SDK per consentire all'app di riprodurre un annuncio
video. La tua app utilizza questa interfaccia anche per informare l'SDK degli annunci video principali
eventi. Per implementare l'interfaccia, procedi nel seguente modo.
Crea un riproduttore di annunci video
Il primo passaggio consiste nel creare un corso VideoAdPlayer
anonimo
tra requestAds()
:
private VideoAdPlayer videoAdPlayer;
...
private void requestAds(String adTagUrl) {
videoAdPlayer = new VideoAdPlayer() {
};
}
Aggiungi metodi video
Poi, aggiungi metodi che indichino al video player di riprodurre, caricare, interrompere e mettere in pausa l'annuncio video. Aggiungiamo anche i metodi per rilasciare il player e ottenere il volume qui:
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();
}
};
Questi metodi sono involucri sottili che circondano le parti simili di machine learning. Tieni presente che questi metodi impostano una variabile interna che viene utilizzata per tenere traccia della visualizzazione di un annuncio. Nella riproduzione di un annuncio personalizzato, video player riproduce annunci video e annunci video, quindi devi traccia di cui è attualmente visualizzata.
Avanzamento della riproduzione dell'annuncio
L'interfaccia VideoAdPlayer
implementa un'altra interfaccia,
AdProgressProvider
, quindi devi implementarlo anche. Ha solo
un metodo, getAdProgress()
, usato dall'SDK per ottenere
informazioni sulla riproduzione degli annunci. Aggiungila al tuo VideoAdPlayer
anonimo
di seguito gli altri metodi:
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()
restituisce un tipo VideoProgressUpdate
, che
deve essere composta dalla posizione e dalla durata correnti del video. Se il player
non sta riproducendo un annuncio o la durata non è disponibile, viene restituito
VideoProgressUpdate.VIDEO_TIME_NOT_READY
come mostrato nell'esempio.
Gestisci i callback video
Per la riproduzione di annunci personalizzati è necessario che l'app comunichi all'SDK i principali
eventi video. Dal punto di vista dell'SDK, si tratta di callback
descritto dall'interfaccia VideoAdPlayer.VideoAdPlayerCallback
.
Prima di passare ai metodi di callback, devi essere
in grado di aggiungere e rimuovere i callback su richiesta dell'SDK. Questo è
operazione completata all'interno di VideoAdPlayer
utilizzando 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);
}
};
Questa implementazione utilizza un List<>
per i callback da cui chiamare
i metodi List<>.add()
e remove()
.
Chiama i numeri di telefono
Ora che l'SDK dispone di un modo per comunicare alla tua app di aggiungere e rimuovere i callback, definisci le posizioni in cui viene chiamato il callback. La tua app deve chiamare tramite questi callback quando si verificano eventi video importanti, come la riproduzione o la pausa. o la ripresa di un video oppure quando un video termina o si verifica un errore.
A questo scopo, espandi SampleVideoPlayer
in modo da avere un listener per questi
Eventi video aggiunti da VideoFragment
. Il motivo per rendere
un ascoltatore separato in SampleVideoPlayer
per richiamare questi callback degli annunci
è che SampleVideoPlayer
non sa nulla sugli annunci,
quindi devi inoltrare gli eventi video
a qualcosa che possa gestire gli annunci.
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);
}
Avviare, mettere in pausa e riprendere
Crea una nuova enum per tenere traccia dello stato di riproduzione e aggiungere nuovi override
per i metodi start()
e pause()
in 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();
}
}
Gestire gli errori
Esegui l'override del listener di errori anonimo del video player impostato in 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;
}
Implementazione del listener
Torna a VideoFragment
e aggiungi un OnVideoEventsListener
anonimo
alla tua istanza 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();
}
}
}
});
Cambia il metodo onVideoCompleted()
di OnVideoCompletedListener
per gestire il caso di completamento di un video pubblicitario:
public void onVideoCompleted() {
// Handle completed event for playing post-rolls.
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onEnded();
}
} else {
if (adsLoader != null) {
adsLoader.contentComplete();
}
}
Passare dai contenuti agli annunci e viceversa
Questo esempio utilizza la stessa istanza del video player per riprodurre entrambi contenuti e annunci, quindi devi aggiungere una logica per passare contenuti e annunci nel player. Dopodiché puoi ricaricare e cercare per tornare al punto in cui è iniziato l'annuncio. Aggiungi due funzioni per farlo:
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;
}
Questi vengono chiamati quando CONTENT_PAUSE_REQUESTED
e
Ricevuti CONTENT_RESUME_REQUESTED
eventi, in
VideoFragment.onAdEvent()
, rispettivamente:
case CONTENT_PAUSE_REQUESTED:
pauseContent();
break;
case CONTENT_RESUME_REQUESTED:
resumeContent();
break;
Attiva la riproduzione di annunci personalizzati
L'ultimo passaggio consiste nell'indicare all'SDK che stai utilizzando la riproduzione di annunci personalizzati.
Per farlo, passa un valore VideoAdPlayer
a AdDisplayContainer
:
adDisplayContainer.setPlayer(videoAdPlayer);
È necessario passare il giocatore a setPlayer()
. In caso contrario,
L'SDK utilizza la riproduzione di proprietà dell'SDK.
È tutto. Questi sono tutti i passaggi necessari per aggiungere la riproduzione di annunci personalizzati al tuo implementazione IMA. Puoi confrontare la tua implementazione con Esempio avanzato su github in caso di problemi.