Настройте рекламные объявления с вознаграждением.

SDK нового поколения.

Выберите платформу: Android iOS Unity Flutter Android (Legacy)

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

В этом руководстве объясняется, как интегрировать рекламные объявления с вознаграждением в приложение для Android.

Прежде чем начать

Прежде чем продолжить, выполните следующие действия:

  • Настройте GMA Next-Gen SDK .
  • Используйте тестовый идентификатор рекламного блока с вознаграждением в межстраничной /21775744923/example/rewarded-interstitial .
    • При разработке и тестировании приложения используйте тестовые объявления, а не рабочие, запущенные рекламные кампании. Несоблюдение этого правила может привести к блокировке вашего аккаунта.
    • Перед публикацией приложения замените этот ID на идентификатор вашего рекламного блока.
    • Подробную информацию о тестовой рекламе в GMA Next-Gen SDK см. в разделе «Включить тестовую рекламу» .

Разберитесь в предварительном размещении рекламы.

В GMA Next-Gen SDK предварительная загрузка рекламы автоматизирует загрузку и кэширование рекламы.

Предварительная загрузка рекламы предоставляет следующие преимущества:

  • Управление ссылками : сохраняет ссылки до момента показа рекламы.
  • Автоматическая перезагрузка : загружает новое объявление, когда предыдущее извлекается из кэша.
  • Управляемые повторные попытки : загружает новое объявление, если предыдущее не загрузилось.
  • Обработка истечения срока действия : обновляет объявления перед истечением срока их действия.
  • Оптимизация кэша : оптимизирует порядок кэширования для показа рекламы с наивысшим приоритетом.

Начать предварительную загрузку рекламы

Чтобы начать предварительную загрузку рекламы, вызовите метод start один раз при запуске приложения. После вызова метода start GMA Next-Gen SDK автоматически выполнит предварительную загрузку рекламы и повторит неудачные запросы на предварительно загруженные конфигурации.

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

Котлин

// Call start() once after SDK initialization.
// Preload only one ad unit per format to optimize performance.
val adRequest = AdRequest.Builder(adUnitId).build()
val preloadConfig = PreloadConfiguration(adRequest)
RewardedInterstitialAdPreloader.start(adUnitId, preloadConfig)

Java

// Call start() once after SDK initialization.
// Preload only one ad unit per format to optimize performance.
AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest);
RewardedInterstitialAdPreloader.start(adUnitId, preloadConfig);

Замените AD_UNIT_ID на идентификатор вашего рекламного блока.

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

Получите и покажите предварительно загруженную рекламу.

Чтобы показать рекламу, вызовите метод pollAd . GMA Next-Gen SDK получает доступную рекламу и автоматически предварительно загружает следующую рекламу в фоновом режиме. Если рекламы нет, GMA Next-Gen SDK не возвращает никаких объявлений.

Когда у вас появится доступный рекламный объект, вызовите метод show для отображения рекламы. Используйте слушатель событий вознаграждения для обработки событий вознаграждения. В следующем примере показано, как получить и показать предварительно загруженную рекламу:

Котлин

private fun pollAndShowAd(activity: Activity, adUnitId: String) {
  // Polling returns the next available ad and loads another ad in the background.
  val ad = RewardedInterstitialAdPreloader.pollAd(adUnitId)
  if (ad == null) {
    Log.e(TAG, "Rewarded interstitial ad is not available.")
    return
  }

  // Interact with the ad object as needed.
  Log.d(TAG, "Rewarded interstitial ad response info: ${ad.getResponseInfo()}")
  ad.adEventCallback =
    object : RewardedInterstitialAdEventCallback {
      override fun onAdImpression() {
        Log.d(TAG, "Rewarded interstitial ad recorded an impression.")
      }
    }
  ad.show(activity) { rewardItem -> Log.d(TAG, "User earned reward: ${rewardItem.amount}") }
}

Java

private void pollAndShowAd(Activity activity, String adUnitId) {
  // Polling returns the next available ad and loads another ad in the background.
  final RewardedInterstitialAd ad = RewardedInterstitialAdPreloader.pollAd(adUnitId);

  // Interact with the ad object as needed.
  if (ad == null) {
    Log.e(TAG, "Rewarded interstitial ad is not available.");
    return;
  }

  Log.d(TAG, "Rewarded interstitial ad response info: " + ad.getResponseInfo());
  ad.setAdEventCallback(
      new RewardedInterstitialAdEventCallback() {
        @Override
        public void onAdImpression() {
          Log.d(TAG, "Rewarded interstitial ad recorded an impression.");
        }
      });

  // Show the ad.
  ad.show(
      activity,
      rewardItem -> {
        Log.d(TAG, "User earned reward: " + rewardItem.getAmount());
      });
}

Не вызывайте метод pollAd , пока не будете готовы показать рекламу. Чтобы прочитать информацию об ответе на объявление, не показывая его, см. раздел «Чтение информации об ответе» .

Слушайте рекламные события

Перед показом рекламы отслеживайте события, связанные с рекламой. В следующем примере показано, как зарегистрировать обратные вызовы для событий, связанных с рекламой:

Котлин

private fun listenToAdEvents() {
  // Listen for ad events.
  val ad = rewardedInterstitialAd
  if (ad == null) {
    Log.e(TAG, "Rewarded interstitial ad is not ready yet.")
    return
  }

  ad.adEventCallback =
    object : RewardedInterstitialAdEventCallback {
      override fun onAdShowedFullScreenContent() {
        // Rewarded interstitial ad did show.
      }

      override fun onAdDismissedFullScreenContent() {
        // Rewarded interstitial ad did dismiss.
        rewardedInterstitialAd = null
      }

      override fun onAdFailedToShowFullScreenContent(
        fullScreenContentError: FullScreenContentError
      ) {
        // Rewarded interstitial ad failed to show.
        Log.e(TAG, "Rewarded interstitial ad failed to show: ${fullScreenContentError.message}")
      }

      override fun onAdImpression() {
        // Rewarded interstitial ad did record an impression.
      }

      override fun onAdClicked() {
        // Rewarded interstitial ad did record a click.
      }
    }
}

Java

private void listenToAdEvents() {
  // Listen for ad events.
  if (rewardedInterstitialAd == null) {
    Log.e(TAG, "Rewarded interstitial ad is not ready yet.");
    return;
  }

  rewardedInterstitialAd.setAdEventCallback(
      new RewardedInterstitialAdEventCallback() {
        @Override
        public void onAdShowedFullScreenContent() {
          // Rewarded interstitial ad did show.
        }

        @Override
        public void onAdDismissedFullScreenContent() {
          // Rewarded interstitial ad did dismiss.
          rewardedInterstitialAd = null;
        }

        @Override
        public void onAdFailedToShowFullScreenContent(
            @NonNull FullScreenContentError fullScreenContentError) {
          // Rewarded interstitial ad failed to show.
          Log.e(
              TAG,
              "Rewarded interstitial ad failed to show: " + fullScreenContentError.getMessage());
        }

        @Override
        public void onAdImpression() {
          // Rewarded interstitial ad did record an impression.
        }

        @Override
        public void onAdClicked() {
          // Rewarded interstitial ad did record a click.
        }
      });
}

Необязательно: Проверить обратные вызовы серверной проверки (SSV).

Если вашему приложению требуются дополнительные данные в коллбэках проверки на стороне сервера, используйте функцию пользовательских данных в межстраничных объявлениях с вознаграждением. Любое строковое значение, заданное для объекта межстраничного объявления с вознаграждением, передается в параметр запроса custom_data коллбэка SSV. Если значение пользовательских данных не задано, значение параметра запроса custom_data не будет присутствовать в коллбэке SSV.

Приведенный ниже пример кода демонстрирует, как задать пользовательские данные для объекта межстраничной рекламы с вознаграждением перед показом рекламы:

Котлин

RewardedInterstitialAd.load(
  context,
  AD_UNIT_ID,
  AdRequest.Builder().build(),
  object : RewardedInterstitialAdLoadCallback() {
    override fun onAdLoaded(ad: RewardedInterstitialAd) {
      rewardedInterstitialAd = ad
      val options =
        ServerSideVerificationOptions.Builder().setCustomData("SAMPLE_CUSTOM_DATA_STRING").build()
      rewardedInterstitialAd?.setServerSideVerificationOptions(options)
    }
  },
)

Java

RewardedInterstitialAd.load(
    context,
    AD_UNIT_ID,
    new AdRequest.Builder().build(),
    new RewardedInterstitialAdLoadCallback() {
      @Override
      public void onAdLoaded(RewardedInterstitialAd ad) {
        rewardedInterstitialAd = ad;
        ServerSideVerificationOptions options =
            new ServerSideVerificationOptions.Builder()
                .setCustomData("SAMPLE_CUSTOM_DATA_STRING")
                .build();
        rewardedInterstitialAd.setServerSideVerificationOptions(options);
      }
    });

Замените SAMPLE_CUSTOM_DATA_STRING на ваши пользовательские данные.

Необязательно: Отслеживать события предварительной загрузки

При запуске предварительной загрузки рекламы зарегистрируйтесь для получения уведомлений о событиях предварительной загрузки, чтобы получать оповещения об успешной предварительной загрузке рекламы, сбое предварительной загрузки или исчерпании рекламного кэша.

В следующем примере показано, как зарегистрироваться для участия в событиях предварительной загрузки рекламы:

Котлин

val preloadCallback =
  // [Important] Don't call ad preloader start() or pollAd() within the PreloadCallback.
  object : PreloadCallback {
    override fun onAdFailedToPreload(preloadId: String, adError: LoadAdError) {
      Log.d(
        TAG,
        "Rewarded interstitial preload ad $preloadId failed to load with error: ${adError.message}",
      )
    }

    override fun onAdsExhausted(preloadId: String) {
      Log.i(TAG, "Rewarded interstitial preload ad $preloadId is not available")
      // [Important] Don't call ad preloader start() or pollAd() from onAdsExhausted.
    }

    override fun onAdPreloaded(preloadId: String, responseInfo: ResponseInfo) {
      Log.i(TAG, "Rewarded interstitial preload ad $preloadId is available")
    }
  }
val adRequest = AdRequest.Builder(adUnitId).build()
val preloadConfig = PreloadConfiguration(adRequest)
RewardedInterstitialAdPreloader.start(adUnitId, preloadConfig, preloadCallback)

Java

PreloadCallback preloadCallback =
    // [Important] Don't call ad preloader start() or pollAd() within the PreloadCallback.
    new PreloadCallback() {
      @Override
      public void onAdFailedToPreload(@NonNull String preloadId, @NonNull LoadAdError adError) {
        Log.d(
            TAG,
            String.format(
                "Rewarded interstitial preload ad %s failed to load with error: %s",
                preloadId, adError.getMessage()));
        // [Optional] Get the error response info for additional details.
        // ResponseInfo responseInfo = adError.getResponseInfo();
      }

      @Override
      public void onAdsExhausted(@NonNull String preloadId) {
        Log.i(TAG, "Rewarded interstitial preload ad " + preloadId + " is not available");
        // [Important] Don't call ad preloader start() or pollAd() from onAdsExhausted.
      }

      @Override
      public void onAdPreloaded(@NonNull String preloadId, @NonNull ResponseInfo responseInfo) {
        Log.i(TAG, "Rewarded interstitial preload ad " + preloadId + " is available");
      }
    };
AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest);
RewardedInterstitialAdPreloader.start(adUnitId, preloadConfig, preloadCallback);

Если реклама не загружается, GMA Next-Gen SDK автоматически предварительно загружает рекламу и повторяет неудачные запросы для получения предварительно загруженных конфигураций.

(Необязательно): Проверьте доступность рекламы.

Если вам нужно узнать, доступна ли реклама, проверьте её доступность. В следующем примере показано, как проверить доступность предварительно загруженной рекламы:

Котлин

private fun isAdAvailable(adUnitId: String): Boolean {
  return RewardedInterstitialAdPreloader.isAdAvailable(adUnitId)
}

Java

private boolean isAdAvailable(String adUnitId) {
  return RewardedInterstitialAdPreloader.isAdAvailable(adUnitId);
}

Необязательно: укажите размер буфера.

Размер буфера определяет количество предварительно загруженных рекламных объявлений, хранящихся в памяти. По умолчанию Google оптимизирует размер буфера для баланса между потреблением памяти и задержкой показа рекламы. Вы можете установить собственный размер буфера, чтобы увеличить количество рекламных объявлений, хранящихся в памяти. Мы рекомендуем максимальный размер буфера в 4 объявления.

В следующем примере показано, как установить размер буфера в 4 предварительно загруженных рекламных объявления:

Котлин

val adRequest = AdRequest.Builder(adUnitId).build()
// Maintain small or default buffer size unless rapid transitions are expected.
val preloadConfig = PreloadConfiguration(adRequest, bufferSize = 4)
RewardedInterstitialAdPreloader.start(adUnitId, preloadConfig)

Java

// Maintain small or default buffer size unless rapid transitions are expected.
AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest, 4);
RewardedInterstitialAdPreloader.start(adUnitId, preloadConfig);

Ограничения предварительной загрузки кэша

GMA Next-Gen SDK устанавливает общеприложениевое ограничение на общее количество предварительно загруженных рекламных объявлений по всем рекламным блокам и идентификаторам предварительной загрузки:

  • Ограничение по умолчанию: Google хранит в памяти максимум 6 предварительно загруженных объявлений. Это ограничение действует для всех форматов и идентификаторов предварительной загрузки.
  • Мы рекомендуем устанавливать размер буфера равным 2 или 3 на каждый идентификатор предварительной загрузки.

(Необязательно) Остановить предварительную загрузку рекламы

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

Следующий пример показывает, как остановить предварительную загрузку рекламы:

Котлин

private fun stopPreloading(adUnitId: String) {
  // Stops the preloading and destroy preloaded ads.
  RewardedInterstitialAdPreloader.destroy(adUnitId)
}

Java

private void stopPreloading(String adUnitId) {
  // Stops the preloading and destroy preloaded ads.
  RewardedInterstitialAdPreloader.destroy(adUnitId);
}

Необязательно: ознакомьтесь с информацией об ответе.

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

В следующем примере показано, как считывать информацию о следующем предварительно загруженном рекламном ответе:

Котлин

val responseInfo = RewardedInterstitialAdPreloader.peekAdResponseInfo(preloadId)
if (responseInfo == null) {
  Log.e(TAG, "Failed to peek ad response info.")
  return
}

Log.d(TAG, "Peeked ad response ID: ${responseInfo.responseId}")

Java

ResponseInfo responseInfo = RewardedInterstitialAdPreloader.peekAdResponseInfo(preloadId);
if (responseInfo == null) {
  Log.e(TAG, "Failed to peek ad response info.");
  return;
}

Log.d(TAG, "Peeked ad response ID: " + responseInfo.getResponseId());