Расширенная интеграция (InStream API)
Это архивная версия документации. Актуальная документация по всем платформам находится здесь.
InStream API — расширенный API для настройки, управления загрузкой и воспроизведением InStream рекламы. Позволяет поддержать проигрывание всех типов рекламных вставок, а также использовать свою реализацию плеера. InStream реклама состоит из рекламных вставок, которые проигрываются автоматически и вручную.
Для автоматического проигрывания вставок с типом Pre-Roll, Mid-Roll, Post-Roll используется InstreamAdBinder API. Для ручного запуска рекламных вставок с типом In-Roll и Pause-Roll используются In-Roll API и Pause-Roll API соответственно.
- Используйте разные инстансы рекламного плеера.
- Не запускайте Pause-Roll и In-Roll API для воспроизведения, если через InStreamAdBinder API было приостановлено основное видео.
Принципы работы
Загруженный объект InStream рекламы содержит в себе расписание показа рекламных вставок. Каждая рекламная вставка описывается объектом InstreamAdBreak. Рекламная вставка может иметь один из следующих типов: Pre / Mid / Post / In / Pause-Roll. Показать Pre/MidPost-Roll вставки можно через InstreamAdBinder API. Показать In / Pause-Roll вставки можно через In-Roll API и Pause-Roll API соответственно.
Для взаимодействия с основным видеоконтентом используется интерфейс VideoPlayer, а для воспроизведения рекламного видео внутри рекламной вставки — интерфейс InstreamAdPlayer.
InstreamAdBinder отслеживает ход воспроизведения основного видео и показывает рекламные вставки на основе настроек видеоресурса в Партнерском Интерфейсе.
InstreamAdBinder не управляет непосредственно отрисовкой рекламного видео в PlayerView. Воспроизводить рекламное видео необходимо со стороны приложения основываясь на сигналах от интерфейсов плееров, переданных в InstreamAdBinder. InstreamAdBinder сообщает о начале проигрывания рекламной вставки через вызов VideoPlayer.pauseVideo() и об окончании проигрывания рекламной вставки через вызов VideoPlayer.resumeVideo().
В момент вызова VideoPlayer.pauseVideo() со стороны приложения необходимо скрыть контролы управления основным видео, приостановить основное видео и начать воспроизведение рекламного видео. Со стороны рекламного SDK после вызова метода будут показаны рекламные контролы внутри контейнера InstreamAdView и будет вызван метод InstreamAdPlayer.playAd() для старта воспроизведения рекламного видео.
В момент вызова VideoPlayer.resumeVideo() со стороны приложения необходимо вернуть контролы управления основным видео и продолжить воспроизведение основного видео. Со стороны рекламного SDK до вызова метода будут убраны рекламные контролы внутри контейнера InstreamAdView.
In / Pause-Roll API не управляет непосредственно отрисовкой рекламного видео в PlayerView. Воспроизводить рекламное видео необходимо со стороны приложения основываясь на сигналах от интерфейсов плееров, переданных в In / Pause-Roll. In / Pause-Roll сообщает о начале проигрывания рекламной вставки через вызов InstreamAdBreakEventListener.onInstreamAdBreakStarted() и об окончании проигрывания рекламной вставки через вызов InstreamAdBreakEventListener.onInstreamAdBreakCompleted() или InstreamAdBreakEventListener.onInstreamAdBreakError().
В момент вызова InstreamAdBreakEventListener.onInstreamAdBreakStarted() со стороны приложения необходимо скрыть контролы управления основным видео, приостановить основное видео. Со стороны рекламного SDK после вызова метода будут показаны рекламные контролы внутри контейнера InstreamAdView и будет вызван метод InstreamAdPlayer.playAd() для старта воспроизведения рекламного видео.
В момент вызова InstreamAdBreakEventListener.onInstreamAdBreakCompleted() или InstreamAdBreakEventListener.onInstreamAdBreakError() со стороны приложения необходимо вернуть контролы управления основным видео и продолжить воспроизведение основного видео. Со стороны рекламного SDK до вызова методов будут убраны рекламные контролы из контейнера InstreamAdView.
Загрузка рекламных объявлений
Создайте экземпляр класса InstreamAdLoader для получения InStream рекламы.
Настройте получение уведомлений (успешная загрузка рекламы или ошибка при загрузке рекламы): создайте экземпляр InstreamAdLoadListener и установите его в качестве слушателя событий загрузчика рекламных объявлений.
Создайте конфигурацию запроса
instreamAdRequestConfiguration
с помощью класса InstreamAdRequestConfiguration.Builder. В качестве параметров запроса передайте идентификатор страницы (Page ID
) из Партнерского интерфейса.Загрузите рекламу с помощью метода InstreamAdLoader.loadInstreamAd, передайте в него
Context
иinstreamAdRequestConfiguration
.
- Пример кода:
-
Для тестирования корректности интеграции используйте демонстрационный Page ID: demo-instream-vmap-yandex.
final InstreamAdLoader instreamAdLoader = new InstreamAdLoader(context); instreamAdLoader.setInstreamAdLoadListener(new InstreamAdLoadListener() { @override public void onInstreamAdLoaded(@NonNull final InstreamAd instreamAd) { ... } @override public void onInstreamAdFailedToLoad(@NonNull final String reason) { ... } }); final InstreamAdRequestConfiguration instreamAdRequestConfiguration = new InstreamAdRequestConfiguration.Builder(PAGE_ID).build(); instreamAdLoader.loadInstreamAd(this, instreamAdRequestConfiguration);
Показ рекламных объявлений
Реализуйте интерфейсы InstreamAdPlayer и VideoPlayer.
В разделах справочника Package com.yandex.mobile.ads.instream.player.ad и Package com.yandex.mobile.ads.instream.player.content приведена подробная информация по работе методов и их реализации. Дополнительно рекомендуется ориентироваться на тестовый пример реализации.
Внимание.Для упрощения реализации, рекомендуется использовать разные инстансы плееров для воспроизведения рекламы и контентного видео.
Добавьте в layout приложения InstreamAdView. InstreamAdView должна содержать в себе PlayerView, в которой будут проигрываться рекламные ролики.
- Пример кода:
- Ограничение.
Размер контейнера должен быть не меньше 300dp x 160dp.
<com.yandex.mobile.ads.instream.player.ad.InstreamAdView android:id="@+id/instream_ad_view" android:layout_width="match_parent" android:layout_height="wrap_content"> <PlayerView android:id="@+id/player_view" android:layout_width="match_parent" android:layout_height="wrap_content"/> </com.yandex.mobile.ads.instream.player.ad.InstreamAdView>
Создайте объект InstreamAdBinder: передайте в конструктор
Context
, объект загруженной рекламы InstreamAd и реализации плееров InstreamAdPlayer, VideoPlayer.Настройте получение уведомлений о ходе воспроизведения рекламы (готовность к проигрыванию видеорекламы, завершение воспроизведения или ошибка в процессе воспроизведения): создайте экземпляр InstreamAdListener и установите его в качестве слушателя событий объекта InstreamAdBinder.
mInstreamAdBinder = new InstreamAdBinder(context, mInstreamAd, mYandexAdPlayer, mContentVideoPlayer); mInstreamAdBinder.setInstreamAdListener(...);
Для ускорения старта рекламной вставки с типом Pre-Roll, заранее предзагрузите ее через вызов метода InstreamAdBinder.prepareAd().
private void preparePrerollAd(@NonNull final InstreamAdBinder instreamAdBinder) { instreamAdBinder.setInstreamAdListener(new InstreamAdListener() { ... public void onInstreamAdPrepared() { addInstreamAdBinderToPreloadedAdQueue(instreamAdBinder); } ... }); instreamAdBinder.prepareAd(); }
Вызовите метод InstreamAdBinder.bind(instreamAdView) у созданного объекта InstreamAdBinder. В качестве параметра передайте InstreamAdView. После этого InStream SDK начнет автоматически отслеживать прогресс воспроизведения основного видео и возьмет на себя управление проигрыванием рекламных роликов.
mInstreamAdBinder.bind(mInstreamAdView);
При реализации проигрывания InStream рекламы в списке, необходимо использовать метод InStreamBinder.unbind() при инвалидации ячейки с рекламой в списке. При реализации переиспользуемого пула плееров для скролла, необходимо вызывать InstreamAdbinder.invalidateAdPlayer() при переиспользовании плеера рекламы привязанного к InstreamAdBinder, а при переиспользовании плеера основного контента InstreamAdBinder.invalidateVideoPlayer().
При остановке использования InStreamAdBinder необходимо очищать состояние.
public void onDestroy() { instreamAdBinder.unbind(); instreamAdBinder.invalidateVideoPlayer(); instreamAdBinder.invalidateAdPlayer(); instreamAdBinder.setInstreamAdListener(null); instreamAdBinder.setVideoAdPlaybackListener(null); super.onDestroy(); }
Показ рекламной вставки Pause-Roll настраивается по аналогии с In-Roll. Для этого замените In-Roll классы / методы на Pause-Roll.
Реализуйте интерфейс InstreamAdPlayer.
В разделе справочника Package com.yandex.mobile.ads.instream.player.ad приведена подробная информация по работе методов и их реализации. Дополнительно рекомендуется ориентироваться на тестовый пример реализации.
Внимание.Для упрощения реализации, рекомендуется использовать разные инстансы плееров для воспроизведения рекламы и контентного видео.
Добавьте в layout приложения InstreamAdView. InstreamAdView должна содержать в себе PlayerView, в которой будут проигрываться рекламные ролики.
- Пример кода:
- Ограничение.
Размер контейнера должен быть не меньше 300dp x 160dp.
<com.yandex.mobile.ads.instream.player.ad.InstreamAdView android:id="@+id/instream_ad_view" android:layout_width="match_parent" android:layout_height="wrap_content"> <PlayerView android:id="@+id/player_view" android:layout_width="match_parent" android:layout_height="wrap_content"/> </com.yandex.mobile.ads.instream.player.ad.InstreamAdView>
Загрузите через InstreamAdLoader объект InstreamAd с помощью идентификатора страницы (
Page ID
) из Партнерского интерфейса.InstreamAd содержит в себе набор рекламных вставок разных типов. Чтобы получить рекламные вставки In-Roll, используйте InrollQueueProvider. Очередь InrollQueueProvider позволяет получать объекты In-Roll в необходимом для показа порядке.
public void onInstreamAdLoaded(@NonNull final InstreamAd instreamAd) { final InrollQueueProvider inrollQueueProvider = new InrollQueueProvider(context, instreamAd); mInstreamAdBreakQueue = inrollQueueProvider.getQueue(); }
Для запуска полученного In-Roll, необходимо его подготовить. Без подготовки In-Roll не запустится.
Чтобы подготовить In-Roll, вызовите Inroll.prepare(instreamAdPlayer) интерфейса и передайте в него инстанс созданной реализации InstreamAdPlayer. Для отслеживания состояния рекламной вставки установите слушатель InstreamAdBreakEventListener
public void prepare(instreamAdPlayer) { currentInroll = mInstreamAdBreakQueue.poll(); currentInroll.setListener(new InrollListener()); currentInroll.prepare(instreamAdPlayer); }
По окончанию подготовки In-Roll будет вызван InstreamAdBreakEventListener.onInstreamAdBreakPrepared(). Подготовленный In-Roll готов к показу.
Совет.Показывайте объявления в порядке их получения из InstreamAdBreakQueue. Показ полученных In-Roll в другом порядке может снизить монетизацию вашего приложения.
Чтобы показать подготовленный In-Roll, вызовите Inroll.play() и передайте в качестве параметра InstreamAdView.
public void onInstreamAdBreakPrepared() { if (currentInroll != null) { currentInroll.play(instreamAdView); } }
После начала проигрывания рекламной вставки, будет вызван метод InstreamAdBreakEventListener.onInstreamAdBreakStarted(). По вызову этого метода необходимо поставить на паузу проигрывание основного видео и скрыть контролы управления основного видео.
public void onInstreamAdBreakPrepared() { if (contentVideoPlayer != null) { contentVideoPlayer.pauseVideo(); } }
После проигрывания рекламной вставки необходимо продолжить воспроизведение основного видео. Проигрывание рекламной вставки может завершиться успешно или с ошибкой, эти две ситуации необходимо обрабатывать.
@Override public void onInstreamAdBreakCompleted() { handleAdBreakCompleted(); } @Override public void onInstreamAdBreakError(@NonNull final String reason) { handleAdBreakCompleted(); } private void handleAdBreakCompleted() { currentInroll = null; if (contentVideoPlayer != null) { contentVideoPlayer.resumeVideo(); } }
После завершения проигрывания текущего InRoll проверьте очередь воспроизведения на наличие следующего In-Roll в InstreamAdBreakQueue.
public void prepareNextAd() { currentInroll = mInstreamAdBreakQueue.poll(); if (currentInroll != null) { prepareInroll(currentInroll); } }
При остановке использования In-Roll необходимо очищать его состояние.
public void onDestroy() { if (currentInroll != null) { currentInroll.invalidate(); currentInroll.setListener(null); } super.onDestroy(); }