Расширенная интеграция (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 соответственно.

Примечание

Доступно одновременное использование InstreamAdBinder API, In-roll API и Pause-roll API при соблюдении определенных условий:

  1. Используйте разные инстансы рекламного плеера.
  2. Не запускайте Pause-roll и In-roll API для воспроизведения, если через InStreamAdBinder API было приостановлено основное видео.

Принципы работы

Загруженный объект InStream-рекламы содержит в себе расписание показа рекламных вставок. Каждая рекламная вставка описывается объектом InstreamAdBreak. Рекламная вставка может иметь один из следующих типов: Pre / Mid / Post / In / Pause-roll. Показать Pre / Mid / Post-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.

Загрузка рекламных объявлений

  1. Создайте экземпляр класса InstreamAdLoader для получения InStream-рекламы.

  2. Настройте получение уведомлений (успешная загрузка рекламы или ошибка при загрузке рекламы): создайте экземпляр InstreamAdLoadListener и установите его в качестве слушателя событий загрузчика рекламных объявлений.

  3. Создайте конфигурацию запроса instreamAdRequestConfiguration с помощью класса InstreamAdRequestConfiguration.Builder. В качестве параметров запроса передайте идентификатор страницы (Page_ID) из Партнерского интерфейса.

  4. Загрузите рекламу с помощью метода InstreamAdLoader.loadInstreamAd, передайте в него Context и instreamAdRequestConfiguration.

Пример кода:

Для тестирования корректности интеграции используйте демонстрационный Page_ID: demo-instream-vmap-yandex.

val instreamAdLoader = InstreamAdLoader(this)
instreamAdLoader.setInstreamAdLoadListener(object : InstreamAdLoadListener {
    override fun onInstreamAdLoaded(instreamAd: InstreamAd) {
        // ...
    }

    override fun onInstreamAdFailedToLoad(reason: String) {
        // ...
    }
})

val instreamAdRequestConfiguration = InstreamAdRequestConfiguration.Builder(PAGE_ID).build()
instreamAdLoader.loadInstreamAd(this, instreamAdRequestConfiguration)
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);

Показ рекламных объявлений

  1. Реализуйте интерфейсы InstreamAdPlayer и VideoPlayer.

    В разделах справочника Package com.yandex.mobile.ads.instream.player.ad и Package com.yandex.mobile.ads.instream.player.content приведена подробная информация по работе методов и их реализации. Дополнительно рекомендуется ориентироваться на тестовый пример реализации.

    Совет

    Для упрощения реализации, рекомендуется использовать разные инстансы плееров для воспроизведения рекламы и контентного видео.

  2. Добавьте в 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>
    
  3. Создайте объект InstreamAdBinder: передайте в конструктор Context, объект загруженной рекламы InstreamAd и реализации плееров InstreamAdPlayer, VideoPlayer.

    Настройте получение уведомлений о ходе воспроизведения рекламы (готовность к проигрыванию видеорекламы, завершение воспроизведения или ошибка в процессе воспроизведения): создайте экземпляр InstreamAdListener и установите его в качестве слушателя событий объекта InstreamAdBinder.

    instreamAdBinder = InstreamAdBinder(
        this,
        instreamAd,
        checkNotNull(instreamAdPlayer),
        checkNotNull(contentVideoPlayer)
    )
    instreamAdBinder.setInstreamAdListener(...)
    
    mInstreamAdBinder = new InstreamAdBinder(context, mInstreamAd, mYandexAdPlayer, mContentVideoPlayer);
    mInstreamAdBinder.setInstreamAdListener(...);
    
  4. Для ускорения старта рекламной вставки с типом Pre-roll, заранее предзагрузите ее через вызов метода InstreamAdBinder.prepareAd().

    private fun preparePrerollAd(instreamAdBinder: InstreamAdBinder) {
        instreamAdBinder.setInstreamAdListener(object : InstreamAdListener {
            // ...
            override fun onInstreamAdPrepared() {
                addInstreamAdBinderToPreloadedAdQueue(instreamAdBinder)
            } // ...
        })
        instreamAdBinder.prepareAd()
    }
    
    private void preparePrerollAd(@NonNull final InstreamAdBinder instreamAdBinder) {
        instreamAdBinder.setInstreamAdListener(new InstreamAdListener() {
            // ...
            public void onInstreamAdPrepared() {
                addInstreamAdBinderToPreloadedAdQueue(instreamAdBinder);
            }
            // ...
        });
        instreamAdBinder.prepareAd();
    }
    
  5. Вызовите метод InstreamAdBinder.bind(instreamAdView) у созданного объекта InstreamAdBinder. В качестве параметра передайте InstreamAdView. После этого InStream SDK начнет автоматически отслеживать прогресс воспроизведения основного видео и возьмет на себя управление проигрыванием рекламных роликов.

    instreamAdBinder.bind(instreamAdView)
    
    mInstreamAdBinder.bind(mInstreamAdView);
    
  6. При реализации проигрывания InStream-рекламы в списке, необходимо использовать метод InStreamBinder.unbind() при инвалидации ячейки с рекламой в списке. При реализации переиспользуемого пула плееров для скролла, необходимо вызывать InstreamAdbinder.invalidateAdPlayer() при переиспользовании плеера рекламы привязанного к InstreamAdBinder, а при переиспользовании плеера основного контента InstreamAdBinder.invalidateVideoPlayer().

  7. При остановке использования InStreamAdBinder необходимо очищать состояние.

    override fun onDestroy() {
        instreamAdBinder.apply {
            unbind()
            instreamAdBinder.invalidateVideoPlayer()
            instreamAdBinder.invalidateAdPlayer()
            instreamAdBinder.setInstreamAdListener(null)
            instreamAdBinder.setVideoAdPlaybackListener(null)
        }
    
        super.onDestroy()
    }
    
    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.

  1. Реализуйте интерфейс InstreamAdPlayer.

    В разделе справочника Package com.yandex.mobile.ads.instream.player.ad приведена подробная информация по работе методов и их реализации. Дополнительно рекомендуется ориентироваться на тестовый пример реализации.

    Совет

    Для упрощения реализации, рекомендуется использовать разные инстансы плееров для воспроизведения рекламы и контентного видео.

  2. Добавьте в 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>
    
  3. Загрузите через InstreamAdLoader объект InstreamAd с помощью идентификатора страницы (Page_ID) из Партнерского интерфейса.

  4. InstreamAd содержит в себе набор рекламных вставок разных типов. Чтобы получить рекламные вставки In-roll, используйте InrollQueueProvider. Очередь InrollQueueProvider позволяет получать объекты In-roll в необходимом для показа порядке.

    fun onInstreamAdLoaded(instreamAd: InstreamAd) {
        val inrollQueueProvider = InrollQueueProvider(context, instreamAd)
        instreamAdBreakQueue = inrollQueueProvider.queue
    }
    
    public void onInstreamAdLoaded(@NonNull final InstreamAd instreamAd) {
        final InrollQueueProvider inrollQueueProvider = new InrollQueueProvider(context, instreamAd);
        mInstreamAdBreakQueue = inrollQueueProvider.getQueue();
    }
    
  5. Для запуска полученного In-roll, необходимо его подготовить. Без подготовки In-roll не запустится.

    Чтобы подготовить In-roll, вызовите Inroll.prepare(instreamAdPlayer) интерфейса и передайте в него инстанс созданной реализации InstreamAdPlayer. Для отслеживания состояния рекламной вставки установите слушатель InstreamAdBreakEventListener.

    fun prepare(instreamAdPlayer: SampleInstreamAdPlayer) {
        currentInroll = instreamAdBreakQueue.poll()?.apply {
            setListener(InrollListener())
            instreamAdPlayer.let(::prepare)
        }
    }
    
    public void prepare(instreamAdPlayer) {
        currentInroll = mInstreamAdBreakQueue.poll();
        currentInroll.setListener(new InrollListener());
        currentInroll.prepare(instreamAdPlayer);
    }
    
  6. По окончанию подготовки In-roll будет вызван InstreamAdBreakEventListener.onInstreamAdBreakPrepared(). Подготовленный In-roll готов к показу.

    Совет

    Показывайте объявления в порядке их получения из InstreamAdBreakQueue. Показ полученных In-roll в другом порядке может снизить монетизацию вашего приложения.

  7. Чтобы показать подготовленный In-roll, вызовите Inroll.play() и передайте в качестве параметра InstreamAdView.

    fun onInstreamAdBreakPrepared() {
        currentInroll?.play(instreamAdView)
    }
    
    public void onInstreamAdBreakPrepared() {
        if (currentInroll != null) {
            currentInroll.play(instreamAdView);
        }
    }
    
  8. После начала проигрывания рекламной вставки, будет вызван метод InstreamAdBreakEventListener.onInstreamAdBreakStarted(). По вызову этого метода необходимо поставить на паузу проигрывание основного видео и скрыть контролы управления основного видео.

    fun onInstreamAdBreakStarted() {
        contentVideoPlayer?.pauseVideo()
    }
    
    public void onInstreamAdBreakStarted() {
        if (contentVideoPlayer != null) {
            contentVideoPlayer.pauseVideo();
        }
    }
    
  9. После проигрывания рекламной вставки необходимо продолжить воспроизведение основного видео. Проигрывание рекламной вставки может завершиться успешно или с ошибкой, эти две ситуации необходимо обрабатывать.

    override fun onInstreamAdBreakCompleted() {
        handleAdBreakCompleted()
    }
    
    override fun onInstreamAdBreakError(reason: String) {
        handleAdBreakCompleted()
    }
    
    private fun handleAdBreakCompleted() {
        currentInroll = null
        contentVideoPlayer?.resumeVideo()
    }
    
    @Override
    public void onInstreamAdBreakCompleted() {
        handleAdBreakCompleted();
    }
    
    @Override
    public void onInstreamAdBreakError(@NonNull final String reason) {
        handleAdBreakCompleted();
    }
    
    private void handleAdBreakCompleted() {
        currentInroll = null;
        if (contentVideoPlayer != null) {
            contentVideoPlayer.resumeVideo();
        }
    }
    
  10. После завершения проигрывания текущего InRoll проверьте очередь воспроизведения на наличие следующего In-roll в InstreamAdBreakQueue.

    fun prepareNextAd() {
        currentInroll = mInstreamAdBreakQueue.poll()
        currentInroll?.prepareInroll(currentInroll)
    }
    
    public void prepareNextAd() {
        currentInroll = mInstreamAdBreakQueue.poll();
        if (currentInroll != null) {
            prepareInroll(currentInroll);
        }
    }
    
  11. При остановке использования In-roll необходимо очищать его состояние.

    override fun onDestroy() {
        currentInroll?.apply {
            invalidate()
            setListener(null)
        }
        super.onDestroy()
    }
    
    public void onDestroy() {
        if (currentInroll != null) {
            currentInroll.invalidate();
            currentInroll.setListener(null);
        }
        super.onDestroy();
    }