Niestandardowe odtwarzanie reklam za pomocą pakietu IMA SDK na Androida

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.