Реклама с вознаграждением

Реклама с вознаграждением (Rewarded) — это полноэкранный рекламный формат, за просмотр которого пользователь получает бонус или награду (например: внутриигровые монеты, доступ к премиум-функциям, повтор попытки и т. д.).

Примечание

Пользователь принимает решение самостоятельно — не смотреть рекламу или дождаться получения награды.

Примечание

Пример работы всех типов форматов есть в демопроекте.

Пример создания рекламы с вознаграждением

Основные шаги по интеграции рекламы с вознаграждением:

  • Создать и настроить загрузчик рекламы RewardedAdLoader.
  • Зарегистрировать слушатель методов обратного вызова загрузки RewardedAdLoadListener.
  • Загрузить рекламу.
  • Зарегистрировать слушатель методов обратного вызова событий рекламного объявления RewardedAdEventListener.
  • Показать объявление RewardedAd.
  • Выдать пользователю награду за просмотр рекламы.

Особенности подключения рекламы с вознаграждением

  1. Все вызовы методов Yandex Mobile Ads SDK необходимо выполнять из главного потока.

  2. Если вы получили ошибку в коллбэке onAdFailedToLoad(), не пытайтесь загрузить новое объявление снова. Если все же необходимо это сделать, ограничьте число повторных попыток загрузки рекламы. Это поможет избежать постоянных неудачных запросов и проблем с подключением в случае ограничений.

  3. Рекомендуется держать сильную ссылку на загрузчик и рекламу на всем протяжении жизни экрана, в рамках которого происходит взаимодействие с рекламой.

  4. Рекомендуется использовать один инстанс RewardedAdLoader для всех загрузок рекламных объявлений для улучшения производительности.

Загрузка рекламы

Для загрузки рекламы с вознаграждением необходимо создать и настроить RewardedAdLoader объект.

Для этого потребуется Activity или Application context.

Для уведомления об успешной или неудачной загрузке рекламы объекту класса RewardedAdLoader необходимо установить слушатель методов обратного вызова RewardedAdLoadListener

Для загрузки рекламного объявления потребуется идентификатор рекламного места.(adUnitId).

Расширить параметры запроса за рекламой можно через AdRequest.Builder(), передав в запросе данные об интересах пользователя, контекстные данные страницы, локацию или другие дополнительные данные. Дополнительные контекстные данные на запросе могут значительно улучшить качество рекламы.

После загрузки рекламного объявления (вызов метода onAdLoaded(rewardedAd: RewardedAd)) сохраните ссылку на загруженную рекламу RewardedAd до окончания показа.

В следующем примере показано как загрузить рекламу с вознаграждением из Activity:

class RewardedAdActivity : AppCompatActivity(R.layout.activity_rewarded_ad) {
    private var rewardedAd: RewardedAd? = null
    private var rewardedAdLoader: RewardedAdLoader? = null
    private lateinit var binding: ActivityRewardedAdBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityRewardedAdBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Rewarded ads loading should occur after initialization of the SDK.
        // Initialize SDK as early as possible, for example in Application.onCreate or Activity.onCreate
        rewardedAdLoader = RewardedAdLoader(this)
        loadRewardedAd()
    }

    private fun loadRewardedAd() {
        val adRequest = AdRequest.Builder("your-ad-unit-id").build()
        rewardedAdLoader?.loadAd(adRequest, object : RewardedAdLoadListener {
            override fun onAdLoaded(ad: RewardedAd) {
                rewardedAd = ad
                // The ad was loaded successfully. Now you can show loaded ad.
            }

            override fun onAdFailedToLoad(adRequestError: AdRequestError) {
                // Ad failed to load with AdRequestError.
                // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
            }
        })
    }
}
public class RewardedAdActivity extends AppCompatActivity {
    @Nullable
    private RewardedAd mRewardedAd = null;
    @Nullable
    private RewardedAdLoader mRewardedAdLoader = null;
    private ActivityRewardedAdBinding mBinding;

    public RewardedAdActivity() {
        super(R.layout.activity_rewarded_ad);
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = ActivityRewardedAdBinding.inflate(getLayoutInflater());
        setContentView(mBinding.getRoot());

        // Ads loading should occur after initialization of the SDK.
        // Initialize SDK as early as possible, for example in Application.onCreate or Activity.onCreate
        mRewardedAdLoader = new RewardedAdLoader(this);
        loadRewardedAd();
    }

    private void loadRewardedAd() {
        if (mRewardedAdLoader != null) {
            final AdRequest adRequest =
                new AdRequest.Builder("your-ad-unit-id").build();
            mRewardedAdLoader.loadAd(adRequest, new RewardedAdLoadListener() {
                @Override
                public void onAdLoaded(@NonNull final RewardedAd rewardedAd) {
                    mRewardedAd = rewardedAd;
                    // The ad was loaded successfully. Now you can show loaded ad.
                }

                @Override
                public void onAdFailedToLoad(@NonNull final AdRequestError adRequestError) {
                    // Ad failed to load with AdRequestError.
                    // Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
                }
            });
        }
    }
}

Показ объявления

Для отслеживания событий жизненного цикла rewarded рекламы и получения награды, объекту класса RewardedAd необходимо установить слушатель методов обратного вызова RewardedAdEventListener.

Для показа рекламного объявления потребуется передать Activity в метод show загруженного рекламного объявления:

private fun showAd() {
   rewardedAd?.apply {
       setAdEventListener(object : RewardedAdEventListener {
           override fun onAdShown() {
               // Called when ad is shown.
           }

           override fun onAdFailedToShow(adError: AdError) {
           // Called when an RewardedAd failed to show

           // Clean resources after Ad failed to show
               rewardedAd?.setAdEventListener(null)
               rewardedAd = null

           // Now you can preload the next rewarded ad.
               loadRewardedAd()
           }

           override fun onAdDismissed() {
               // Called when ad is dismissed.
               // Clean resources after Ad dismissed
               rewardedAd?.setAdEventListener(null)
               rewardedAd = null

               // Now you can preload the next rewarded ad.
               loadRewardedAd()
           }

           override fun onAdClicked() {
               // Called when a click is recorded for an ad.
           }

           override fun onAdImpression(impressionData: ImpressionData?) {
               // Called when an impression is recorded for an ad.
           }

           override fun onRewarded(reward: Reward) {
               // Called when the user can be rewarded.
           }
       })
       show(this@Activity)
   }
}
private void showAd() {
    if (mRewardedAd != null) {
        mRewardedAd.setAdEventListener(new RewardedAdEventListener() {
            @Override
            public void onAdShown() {
                // Called when ad is shown.
            }

            @Override
            public void onAdFailedToShow(@NonNull final AdError adError) {
                // Called when an ad failed to show.

                // Clean resources after Ad failed to show
              if (mRewardedAd != null) {
                  mRewardedAd.setAdEventListener(null);
                  mRewardedAd = null;
              }

              // Now you can preload the next ad.
              loadRewardedAd();
            }

            @Override
            public void onAdDismissed() {
                // Called when ad is dismissed.
                // Clean resources after Ad dismissed
                if (mRewardedAd != null) {
                    mRewardedAd.setAdEventListener(null);
                    mRewardedAd = null;
                }

                // Now you can preload the next ad.
                loadRewardedAd();
            }

            @Override
            public void onAdClicked() {
                // Called when a click is recorded for an ad.
            }

            @Override
            public void onAdImpression(@Nullable final ImpressionData impressionData) {
                // Called when an impression is recorded for an ad.
            }

            @Override
            public void onRewarded(@NonNull final Reward reward) {
                // Called when the user can be rewarded.
            }
        });
        mRewardedAd.show(this);
    }
}

Освобождение ресурсов

Не храните ссылки на отработанные объявления. Вызывайте setAdEventListener(null) для отработанных объявлений. Это освобождает используемые ресурсы и предотвращает утечки памяти.

override fun onDestroy() {
    super.onDestroy()
    rewardedAdLoader = null
    destroyRewardedAd()
}

private fun destroyRewardedAd() {
    rewardedAd?.setAdEventListener(null)
    rewardedAd = null
}
@Override
protected void onDestroy() {
    super.onDestroy();
    mRewardedAdLoader = null;
    destroyRewardedAd();
}

private void destroyRewardedAd() {
    if (mRewardedAd != null) {
        mRewardedAd.setAdEventListener(null);
        mRewardedAd = null;
    }
}

Проверка интеграции

Соберите и запустите проект. Успешную интеграцию SDK можно проверить в Logcat по ключевому слову YandexAds:

[Integration] Ad type rewarded was integrated successfully