W IMA w wersji 3.30.0 lub starszej pakiet IMA SDK obsługuje całą logikę odtwarzania reklam, a aplikacja dotyczy odtwarzania filmów. Ta metoda nazywa się „Odtwarzanie reklam należące do pakietu SDK”.
Jeśli chcesz odtwarzać reklamy w odtwarzaczu, pakiet SDK udostępnia interfejs służący do tego celu. Takie podejście określamy jako odtwarzanie reklamy” a w dalszej części tego przewodnika znajdziesz informacje o jego implementacji.
Wymagania wstępne
- Podstawowa integracja z IMA.
Zajrzyj do Przykład zaawansowany na GitHubie jako punktu wyjścia, jeśli nie masz obecnie podstawowej wersji IMA i integrację społeczną. W tym przykładzie zaimplementowano już niestandardowe odtwarzanie reklam. Pozostałe w tym przewodniku omówiono funkcje niezbędne do niestandardowego odtwarzania reklam Reklamy IMA.
Interfejs z narzędziem VideoAdPlayer
Niestandardowe odtwarzanie reklam wymaga zaimplementowania przez aplikację
VideoAdPlayer
za pomocą prostego interfejsu online. Ten interfejs jest używany przez pakiet SDK do powiadamiania aplikacji o możliwości odtworzenia reklamy
filmy. Twoja aplikacja korzysta również z tego interfejsu, aby przekazywać do pakietu SDK informacje o dużej reklamie wideo
zdarzeń. Aby wdrożyć interfejs, wykonaj poniższe czynności.
Tworzenie odtwarzacza reklam wideo
Pierwszym krokiem jest utworzenie anonimowej klasy VideoAdPlayer
w requestAds()
:
private VideoAdPlayer videoAdPlayer;
...
private void requestAds(String adTagUrl) {
videoAdPlayer = new VideoAdPlayer() {
};
}
Dodaj metody wideo
Następnie dodaj metody, które nakazują odtwarzaczowi odtworzenie, wczytanie, zatrzymanie i wstrzymanie reklamy filmy. Tutaj również dodajemy metody zwalniania odtwarzacza i uzyskiwania głośności:
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();
}
};
Te metody to cienkie elementy podobne do . Zwróć uwagę, że te metody ustawiają zmienną wewnętrzną używaną aby monitorować, czy reklama się wyświetla. Przy niestandardowym odtwarzaniu reklamy odtwarza zarówno reklamy wideo, jak i reklamy wideo, dlatego musisz którego funkcja jest obecnie wyświetlana.
Postęp odtwarzania reklamy
Interfejs VideoAdPlayer
implementuje kolejny interfejs,
AdProgressProvider
, więc musisz go także zaimplementować. Ma tylko
getAdProgress()
, która jest używana przez SDK do pobierania
informacje o odtwarzaniu reklam. Dodaj do anonimowego VideoAdPlayer
, poniżej innych metod:
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()
zwraca typ VideoProgressUpdate
, który
musi zawierać bieżącą pozycję i czas trwania filmu. Jeśli odtwarzacz
nie odtwarza reklamy lub czas trwania jest niedostępny, poproś
VideoProgressUpdate.VIDEO_TIME_NOT_READY
zgodnie z przykładem.
Zarządzanie rozmowami zwrotnymi wideo
Niestandardowe odtwarzanie reklam wymaga, aby aplikacja informowała pakiet SDK o głównych
zdarzeń wideo. Z perspektywy pakietu SDK są to wywołania zwrotne, które
opisane w interfejsie VideoAdPlayer.VideoAdPlayerCallback
.
Zanim przejdziemy do samych metod wywołania zwrotnego, musisz znać
dodawać i usuwać wywołania zwrotne na żądanie pakietu SDK. To jest
wykonane w VideoAdPlayer
przy użyciu addCallback()
i 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);
}
};
Ta implementacja używa List<>
dla wywołań zwrotnych, które mają być wywoływane
metod List<>.add()
i remove()
.
Wykonywanie połączeń zwrotnych
Dzięki pakietowi SDK możesz teraz poinformować aplikację, że ma dodawać i usuwać wywołania zwrotne. określać miejsca, w których ma być wywoływane wywołanie zwrotne. Aplikacja musi nawiązać połączenie te wywołania zwrotne po wystąpieniu ważnych zdarzeń wideo, takich jak odtwarzanie, wstrzymywanie lub wznowienie filmu, odtwarzanie zakończone lub pojawienie się błędu.
Aby to zrobić, rozwiń listę SampleVideoPlayer
, aby dodać detektor tych
zdarzeń wideo dodanych z przeglądarki VideoFragment
. Dlaczego warto
osobnego detektora w SampleVideoPlayer
, który wywoła te wywołania zwrotne reklam
jest to, że SampleVideoPlayer
nie wie nic o reklamach,
więc musisz przekierować zdarzenia wideo do podmiotu, który obsługuje reklamy.
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);
}
Rozpoczynanie, wstrzymywanie i wznawianie
Utwórz nową wyliczenie, aby śledzić stan odtwarzania i dodawać nowe zastąpienia
dla metod start()
i pause()
w 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();
}
}
Obsługa błędów
Zastąp anonimowy detektor błędów odtwarzacza ustawiony w 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;
}
Wdróż detektor
Wróć do usługi VideoFragment
i dodaj anonimową grupę OnVideoEventsListener
do instancji 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();
}
}
}
});
Zmień metodę onVideoCompleted()
metody OnVideoCompletedListener
do obsługi sytuacji, w której reklama wideo została odtworzona:
public void onVideoCompleted() {
// Handle completed event for playing post-rolls.
if (isAdDisplayed) {
for (VideoAdPlayerCallback callback : adCallbacks) {
callback.onEnded();
}
} else {
if (adsLoader != null) {
adsLoader.contentComplete();
}
}
Przełączanie się między treściami i reklamami
W tym przykładzie użyto tego samego wystąpienia odtwarzacza do odtwarzania treści i reklam, więc trzeba przełączać się między nimi treści i reklam w odtwarzaczu. Następnie możesz załadować stronę ponownie i przewinąć dalej aby wrócić do punktu, w którym reklama się rozpoczęła. Dodaj 2 w następujący sposób:
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;
}
Są one wywoływane, gdy funkcje CONTENT_PAUSE_REQUESTED
i
Odebrano zdarzenia (CONTENT_RESUME_REQUESTED
) w:
VideoFragment.onAdEvent()
odpowiednio:
case CONTENT_PAUSE_REQUESTED:
pauseContent();
break;
case CONTENT_RESUME_REQUESTED:
resumeContent();
break;
Włącz niestandardowe odtwarzanie reklam
Ostatnim krokiem jest poinformowanie pakietu SDK, że używasz niestandardowego odtwarzania reklam.
Aby to zrobić, przekaż VideoAdPlayer
do AdDisplayContainer
:
adDisplayContainer.setPlayer(videoAdPlayer);
Konieczne jest przekazanie odtwarzacza użytkownikowi setPlayer()
. W przeciwnym razie
Pakiet SDK używa odtwarzania należącego do pakietu SDK.
To wszystko. To wszystkie kroki, które trzeba wykonać, aby dodać niestandardowe odtwarzanie reklam do Implementacja IMA. Możesz porównać własną implementację z Przykład zaawansowany na github.