Benutzerdefinierte Anzeigenwiedergabe mit dem IMA SDK für Android

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.