Добавление видеорекламы с бонусом в приложение Android

Audience Network позволяет монетизировать приложения Android за счет рекламы Facebook. Видеореклама с бонусом — это полноэкранная видеореклама, за просмотр которой пользователи получают вознаграждение: виртуальную валюту, игровые предметы, эксклюзивный контент и другие преимущества. Сама реклама представляет собой видео длительностью 15–30 секунд и содержит конечную карточку с призывом к действию. Пропустить такую рекламу нельзя. После воспроизведения видео до конца вы получаете обратный вызов, позволяющий отправить пользователю бонус.

Прежде чем продолжить, обязательно ознакомьтесь с руководствами по началу работы с Audience Network и Android.

Пошаговые инструкции

Шаг 1. Инициализация видеорекламы с бонусом в действии.

Шаг 2. Отображение видеорекламы с бонусом в действии.

Инициализация SDK Audience Network

Этот метод добавлен в SDK Audience Network 5.1 для Android.

Начиная с версии 5.3.0 явная инициализация SDK Audience Network для Android обязательна. Информацию о том, как инициализировать SDK Audience Network для Android, см. в этом документе.

Чтобы создавать рекламные объекты и загружать рекламу, необходимо инициализировать SDK Audience Network. Рекомендуется сделать это при запуске приложения.

public class YourApplication extends Application {
    ...
    @Override
    public void onCreate() {
        super.onCreate();
        // Initialize the Audience Network SDK
        AudienceNetworkAds.initialize(this);       
    }
    ...
}

Шаг 1. Инициализация видеорекламы с бонусом в действии.

Добавьте в начало действия следующий код, чтобы импортировать SDK Facebook Ads:

import com.facebook.ads.*;

Затем инициализируйте объект видео с бонусом, настройте функцию прослушивания и загрузите видеокреатив. Для видеорекламы с бонусом требуется интерфейс RewardedVideoAdListener, который в примере кода реализует следующие методы для обработки различных событий. Например, в вашем действии:

private final String TAG = RewardedVideoAdActivity.class.getSimpleName();
private RewardedVideoAd rewardedVideoAd;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    // Instantiate a RewardedVideoAd object. 
    // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
    // now, while you are testing and replace it later when you have signed up.
    // While you are using this temporary code you will only get test ads and if you release
    // your code like this to the Google Play your users will not receive ads (you will get
    // a no fill error).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        @Override
        public void onError(Ad ad, AdError error) {
            // Rewarded video ad failed to load
            Log.e(TAG, "Rewarded video ad failed to load: " + error.getErrorMessage());
        }

        @Override
        public void onAdLoaded(Ad ad) {
            // Rewarded video ad is loaded and ready to be displayed  
            Log.d(TAG, "Rewarded video ad is loaded and ready to be displayed!");
        }

        @Override
        public void onAdClicked(Ad ad) {
            // Rewarded video ad clicked
            Log.d(TAG, "Rewarded video ad clicked!");
        }

        @Override
        public void onLoggingImpression(Ad ad) {
            // Rewarded Video ad impression - the event will fire when the 
            // video starts playing
            Log.d(TAG, "Rewarded video ad impression logged!");
        }

        @Override
        public void onRewardedVideoCompleted() {
            // Rewarded Video View Complete - the video has been played to the end.
            // You can use this event to initialize your reward
            Log.d(TAG, "Rewarded video completed!");

            // Call method to give reward
            // giveReward();
        }

        @Override
        public void onRewardedVideoClosed() {
            // The Rewarded Video ad was closed - this can occur during the video
            // by closing the app, or closing the end card.
            Log.d(TAG, "Rewarded video ad closed!");
        }
    };
    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .build());
    ...
}

Шаг 2. Отображение видеорекламы с бонусом.

Сценарий 1. Немедленное отображение объявления после загрузки. Измените показанный выше метод onAdLoaded() следующим образом:

private RewardedVideoAd rewardedVideoAd;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    // Instantiate a RewardedVideoAd object. 
    // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
    // now, while you are testing and replace it later when you have signed up.
    // While you are using this temporary code you will only get test ads and if you release
    // your code like this to the Google Play your users will not receive ads (you will get
    // a no fill error).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        ...
        @Override
        public void onAdLoaded(Ad ad) {
            // Rewarded video ad is loaded and ready to be displayed  
            rewardedVideoAd.show();
        }
        ...
    };
    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .build());
    ...
}

Сценарий 2. Отображение объявления через несколько секунд или минут после загрузки. Прежде чем показывать объявление, необходимо проверить, не было ли оно признано недействительным.

Если сразу же после загрузки рекламное объявление не показывается, разработчик должен проверить, не стала ли реклама недействительной. После успешной загрузки реклама остается действительной в течение 60 минут. Показ недействительной рекламы не оплачивается. Чтобы проверить рекламу, вызовите метод isAdInvalidated().

Следуйте идее ниже, но не копируйте код в свой проект. Это всего лишь пример.

private RewardedVideoAd rewardedVideoAd;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    // Instantiate a RewardedVideoAd object. 
    // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
    // now, while you are testing and replace it later when you have signed up.
    // While you are using this temporary code you will only get test ads and if you release
    // your code like this to the Google Play your users will not receive ads (you will get
    // a no fill error).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        ...
    };
    // load the ad
    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .build());

    // Here is just an example for displaying the ad with delay
    // Please call this method at appropriate timing in your project
    showAdWithDelay();
}

private void showAdWithDelay() {
    /**
     * Here is an example for displaying the ad with delay;
     * Please do not copy the Handler into your project
     */
    // Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            // Check if rewardedVideoAd has been loaded successfully
            if (rewardedVideoAd == null || !rewardedVideoAd.isAdLoaded()) {
                return;
            }
            // Check if ad is already expired or invalidated, and do not show ad if that is the case. You will not get paid to show an invalidated ad.
            if (rewardedVideoAd.isAdInvalidated()) {
                return;
            }
            rewardedVideoAd.show();
        }
    }, 1000 * 60 * 15); // Show the ad after 15 minutes
}

Если вы используете эмулятор Google Android по умолчанию, добавьте перед загрузкой тестовой рекламы следующую строку кода:
AdSettings.addTestDevice("HASHED ID");.

Когда вы будете впервые запрашивать загрузку рекламы на устройство, воспользуйтесь хэшированным ID, записанным в LogCat.

Для Genymotion и физических устройств выполнять этот шаг не нужно. Если вы хотели бы выполнить тестирование с настоящей рекламой, изучите Руководство по тестированию.

В конце удалите объект, вызвав метод destroy внутри метода onDestroy своего действия. Обратите внимание, что метод destroy также следует использовать для удаления старых объектов объявлений перед назначением новому экземпляру, чтобы избежать утечки памяти.

@Override
protected void onDestroy() {
    if (rewardedVideoAd != null) {
        rewardedVideoAd.destroy();
        rewardedVideoAd = null;
    }
    super.onDestroy();
}

Аппаратное ускорение для видеорекламы

Для показа видеорекламы в Audience Network необходимо включить обработку с аппаратным ускорением, иначе видео могут не отображаться должным образом. Это касается:

  • видео в нативной рекламе;
  • видео во вставках;
  • рекламных вставок в видео;
  • видео с бонусами.

Аппаратное ускорение включено по умолчанию, если уровень API Target будет не менее 14 (Ice Cream Sandwich, Android 4.0.1), но помимо этого вы можете напрямую включить эту функцию на уровне приложения или действий.

Уровень приложения

Чтобы включить аппаратное ускорение для всего приложения, в файле манифеста Android добавьте следующий атрибут в тег <application>:

<application android:hardwareAccelerated="true" ...>

Уровень действий

Если вы хотите включить эту функцию только для определенных действий в приложении, в файле манифеста Android добавьте следующую функцию в тег <activity>. В примере ниже аппаратное ускорение включено для действия AudienceNetworkActivity, которое используется для обработки рекламных вставок и видео с бонусами.

<activity android:name="com.facebook.ads.AudienceNetworkActivity" android:hardwareAccelerated="true" .../>

Подтверждение бонуса на стороне сервера

Это необязательно. Подтверждение бонуса на стороне сервера не является необходимым условием для показа видеорекламы с бонусом. Вы можете реализовать эту функцию в целях повышения уровня безопасности за счет дополнительной проверки на собственном сервере. Для ее использования предоставьте конечную точку своего издателя представителю Facebook.

Обзор

Если вы управляете бонусами пользователей на стороне сервера, то можете использовать решение Facebook, обеспечивающее безопасность этого процесса. Наш сервер будет подтверждать каждый показ рекламы и каждый бонус, обращаясь к специальной конечной точке.

  1. SDK Audience Network запрашивает видеорекламу с бонусом, используя следующие параметры:
    • ID места размещения в Audience Network;
    • уникальный ID пользователя — атрибут, используемый для идентификации уникального пользователя (например, числовой идентификатор);
    • размер бонуса — размер бонуса, предоставляемого пользователю (например, 100 монет).
  2. По завершении просмотра видео сервер Facebook передает эти значения в указанную вами конечную точку вместе с секретом приложения и уникальным ID транзакции.
  3. Получив эти данные, сервер подтверждает запрос и отправляет следующий ответ:
    • ответ с кодом 200 — запрос действителен, пользователь должен получить бонус;
    • ответ с другим кодом — запрос недействителен, бонус не полагается.
  4. По окончании видео пользователь видит конечную карточку и происходит одно из следующих событий:
    • onRewardServerSuccess — только если на шаге 3 получен ответ с кодом 200;
    • onRewardServerFailed — если на шаге 3 получен ответ с другим кодом.

Пример URL, который будет отправлен в конечную точку вашего издателя сервером Facebook: https://www.vasha_konechnaya_tochka.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

Следующая схема проиллюстрирует весь процесс:

Реализация

После инициализации объекта видео с бонусом до показа рекламы вам нужно передать в нее ID пользователя и размер бонуса. Оба значения являются строковыми. Пример:

private RewardedVideoAd rewardedVideoAd;

private void loadRewardedVideoAd { 
    // Instantiate a RewardedVideoAd object. 
    // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
    // now, while you are testing and replace it later when you have signed up.
    // While you are using this temporary code you will only get test ads and if you release
    // your code like this to the Google Play your users will not receive ads (you will get
    // a no fill error).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        ...
    };

    // Create the rewarded ad data
    RewardData rewardData = new RewardData("YOUR_USER_ID", "YOUR_REWARD");

    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .withRewardData(rewardData)
                    .build());
}

Чтобы приложение получало уведомления о подтверждении бонуса, необходимо реализовать интерфейс S2SRewardedVideoAdListener. Сюда входят все события, указанные выше в интерфейсе RewardedVideoAdListener, а также два дополнительных события. Следующий код можно использовать с упомянутыми выше событиями.

@Override
public void onRewardServerSuccess() {
    // Rewarded video ad validated
}

@Override
public void onRewardServerFailed() {
    // Rewarded video ad not validated or no response from server  
}  

Обратите внимание: обратные вызовы, связанные с подтверждением бонуса на сервере, могут происходить после того, как пользователь закрыл конечную карточку. Не следует освобождать память, занимаемую объектом видео с бонусом, пока не будет выполнен один из таких обратных вызовов.

Дальнейшие действия