In IMA-Version 3.30.0 und niedriger kann das IMA SDK die gesamte Logik für die Anzeigenwiedergabe, während die App hauptsächlich Videoinhalte abspielt. Dieser Ansatz wird als „SDK-eigene Anzeigenwiedergabe“:
Wenn Sie Anzeigen in Ihrem Videoplayer abspielen möchten, eine Schnittstelle dafür zur Verfügung. Wir bezeichnen diesen Ansatz als Anzeigenwiedergabe“ Im weiteren Verlauf dieses Leitfadens geht es um die Implementierung.
Vorbereitung
- Eine grundlegende IMA-Integration
Wir empfehlen Ihnen, sich die Erweitertes Beispiel auf GitHub als Ausgangspunkt, falls Sie derzeit keine einfache IMA In diesem Beispiel wird die benutzerdefinierte Anzeigenwiedergabe bereits implementiert. Der Rest werden die Funktionen beschrieben, die für die Wiedergabe benutzerdefinierter Anzeigen mit IMA-Anzeigen.
Schnittstelle mit VideoAdPlayer
Für die Wiedergabe von benutzerdefinierten Anzeigen muss in Ihrer App die Funktion
VideoAdPlayer
. Diese Schnittstelle wird vom SDK verwendet, um Ihre App zum Abspielen einer Anzeige zu benachrichtigen
Videos. Ihre App verwendet diese Oberfläche auch, um das SDK über wichtige Videoanzeigen zu informieren.
Ereignisse. Führen Sie die folgenden Schritte aus, um die -Schnittstelle zu implementieren.
VideoAdPlayer erstellen
Im ersten Schritt erstellen Sie eine anonyme VideoAdPlayer
-Klasse
in requestAds()
:
private VideoAdPlayer videoAdPlayer;
...
private void requestAds(String adTagUrl) {
videoAdPlayer = new VideoAdPlayer() {
};
}
Videomethoden hinzufügen
Fügen Sie als Nächstes Methoden hinzu, die Ihren Videoplayer anweisen, eine Anzeige wiederzugeben, zu laden, zu stoppen und zu pausieren. Videos. Außerdem fügen wir hier die Methoden zum Freigeben des Players und Abrufen der Lautstärke hinzu:
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();
}
};
Diese Methoden sind dünne Wrapper um die ähnliche . Mit diesen Methoden wird eine interne Variable festgelegt, um zu verfolgen, ob eine Anzeige eingeblendet wird. Bei der benutzerdefinierten Anzeigenwiedergabe im Videoplayer sowohl Content-Video- als auch Videoanzeigen abgespielt werden. der aktuell angezeigt wird.
Fortschritt der Anzeigenwiedergabe
Die VideoAdPlayer
-Schnittstelle implementiert eine weitere Schnittstelle.
AdProgressProvider
, daher müssen Sie es ebenfalls implementieren. Es enthält nur
eine Methode, getAdProgress()
, die vom SDK verwendet wird, um
Wiedergabeinformationen für Anzeigen. Zu deinem anonymen VideoAdPlayer
hinzufügen
-Klasse unter den anderen Methoden:
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()
gibt einen VideoProgressUpdate
-Typ zurück, der
muss aus der aktuellen Position und Dauer des Videos bestehen. Wenn der Spieler
eine Anzeige nicht abspielt oder die Dauer nicht verfügbar ist,
VideoProgressUpdate.VIDEO_TIME_NOT_READY
, wie im Beispiel gezeigt.
Videoanrufe verwalten
Für die Wiedergabe von benutzerdefinierten Anzeigen muss das SDK in Ihrer App über wichtige
Videoereignisse. Aus SDK-Sicht sind dies Callbacks, die
durch die VideoAdPlayer.VideoAdPlayerCallback
-Schnittstelle beschrieben.
Bevor Sie zu den Callback-Methoden kommen, müssen Sie
die Callbacks auf Anfrage des SDKs hinzufügen und entfernen können. Dies ist
innerhalb von VideoAdPlayer
mit addCallback()
und removeCallback()
erstellt:
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);
}
};
Diese Implementierung verwendet ein List<>
für die Callbacks, die aufgerufen werden sollen.
die Methoden List<>.add()
und remove()
.
Callbacks aufrufen
Das SDK kann nun Ihre App anweisen, Callbacks hinzuzufügen und zu entfernen. definieren die Orte, an denen der Callback aufgerufen wird. Ihre App muss folgende Aktionen ausführen: Rückrufen, wenn wichtige Videoereignisse auftreten, wie das Abspielen, Pausieren die Wiedergabe eines Videos fortsetzen oder wenn ein Video zu Ende ist oder ein Fehler auftritt.
Maximieren Sie dazu SampleVideoPlayer
, sodass ein Listener für diese Elemente vorhanden ist.
Videoereignisse, die aus VideoFragment
hinzugefügt werden. Der Grund, warum Sie
Einen separaten Listener in SampleVideoPlayer
, um diese Anzeigen-Callbacks aufzurufen
liegt daran, dass SampleVideoPlayer
nichts über Anzeigen weiß.
Daher müssen Sie die Videoereignisse an einen Dienst weiterleiten, der Anzeigen verarbeiten kann.
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);
}
Starten, pausieren und fortsetzen
Erstellen Sie eine neue Aufzählung, um den Wiedergabestatus zu verfolgen und neue Überschreibungen hinzuzufügen
für die Methoden start()
und 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();
}
}
Fehler verarbeiten
Überschreibe den anonymen Fehler-Listener des Videoplayers, den du in init()
festgelegt hast:
@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;
}
Listener implementieren
Kehren Sie zu VideoFragment
zurück und fügen Sie eine anonyme OnVideoEventsListener
hinzu
in Ihre SampleVideoPlayer
-Instanz:
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();
}
}
}
});
Methode onVideoCompleted()
von OnVideoCompletedListener
ändern
wenn ein Anzeigenvideo beendet ist:
public void onVideoCompleted() {
// Handle completed event for playing post-rolls.
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onEnded();
}
} else {
if (adsLoader != null) {
adsLoader.contentComplete();
}
}
Zwischen Content und Anzeigen wechseln
In diesem Beispiel wird dieselbe Instanz des Videoplayers verwendet, um beide Content und Anzeigen. Sie müssen also einige Logik für den Wechsel zwischen Inhalte und Anzeigen in Ihrem Player. Sie können die Seite dann neu laden um zu dem Punkt zurückzukehren, an dem die Anzeige begonnen hat. Zwei hinzufügen verwenden:
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;
}
Sie werden aufgerufen, wenn die CONTENT_PAUSE_REQUESTED
und
CONTENT_RESUME_REQUESTED
Ereignisse wurden empfangen in
Entsprechend VideoFragment.onAdEvent()
:
case CONTENT_PAUSE_REQUESTED:
pauseContent();
break;
case CONTENT_RESUME_REQUESTED:
resumeContent();
break;
Wiedergabe benutzerdefinierter Anzeigen aktivieren
Im letzten Schritt teilen Sie dem SDK mit, dass Sie die benutzerdefinierte Anzeigenwiedergabe verwenden.
Dazu übergeben Sie eine VideoAdPlayer
an Ihr AdDisplayContainer
:
adDisplayContainer.setPlayer(videoAdPlayer);
Du musst deinen Spieler an setPlayer()
übergeben. Andernfalls wird der
SDK verwendet die SDK-eigene Wiedergabe.
Das war's. Dies sind alle Schritte, die erforderlich sind, um die benutzerdefinierte Wiedergabe von Anzeigen zu Ihrem IMA-Implementierung verwenden. Sie können Ihre eigene Implementierung mit der Erweitertes Beispiel falls Probleme auftreten.