Настройте рекламу с вознаграждением

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

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

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

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

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

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

Разберитесь с предварительной загрузкой рекламы (бета-версия).

Функция предварительной загрузки рекламы (бета-версия) в GMA Next-Gen SDK автоматизирует загрузку и кэширование рекламы.

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

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

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

To begin preloading ads, call the start method once at app start. After you call the start method, GMA Next-Gen SDK automatically preloads ads and retries failed requests for preloaded configurations.

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

Котлин

val adRequest = AdRequest.Builder(adUnitId).build()
val preloadConfig = PreloadConfiguration(adRequest)
RewardedAdPreloader.start(adUnitId, preloadConfig)

Java

AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest);
RewardedAdPreloader.start(adUnitId, preloadConfig);

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

The previous example shows how to use the ad unit ID as the preload ID. A preload ID is a string identifier that you create to identify an ad preloading configuration. If your app requires multiple targeting configurations for the same ad unit ID, pass a custom string identifier.

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

When you want to show an ad, call the pollAd method. GMA Next-Gen SDK retrieves an available ad and automatically preloads the next ad in the background. If no ad is available, GMA Next-Gen SDK returns no ads.

When you have an available ad object, call the show method to display the ad. Use a reward listener to handle reward events. The following example shows how to retrieve and show a preloaded ad:

Котлин

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

  // Interact with the ad object as needed.
  Log.d(TAG, "Rewarded ad response info: ${ad.getResponseInfo()}")
  ad.adEventCallback =
    object : RewardedAdEventCallback {
      override fun onAdImpression() {
        Log.d(TAG, "Rewarded 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 RewardedAd ad = RewardedAdPreloader.pollAd(adUnitId);

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

  Log.d(TAG, "Rewarded ad response info: " + ad.getResponseInfo());
  ad.setAdEventCallback(
      new RewardedAdEventCallback() {
        @Override
        public void onAdImpression() {
          Log.d(TAG, "Rewarded 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 = rewardedAd
  if (ad == null) {
    Log.e(TAG, "Rewarded ad is not ready yet.")
    return
  }

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

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

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

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

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

Java

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

  rewardedAd.setAdEventCallback(
      new RewardedAdEventCallback() {
        @Override
        public void onAdShowedFullScreenContent() {
          // Rewarded ad did show.
        }

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

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

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

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

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

If your app requires extra data in server-side verification callbacks, use the custom data feature of ads. Google ad servers pass any string value set on an ad object to the custom_data query parameter of the SSV callback. If no custom data value is set, the custom_data query parameter value isn't present in the SSV callback.

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

Котлин

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

Java

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

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

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

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

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

Котлин

val preloadCallback =
  object : PreloadCallback {
    override fun onAdFailedToPreload(preloadId: String, adError: LoadAdError) {
      Log.d(TAG, "Rewarded preload ad $preloadId failed to load with error: ${adError.message}")
    }

    override fun onAdsExhausted(preloadId: String) {
      Log.i(TAG, "Rewarded preload ad $preloadId is not available")
    }

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

Java

PreloadCallback preloadCallback =
    new PreloadCallback() {
      @Override
      public void onAdFailedToPreload(String preloadId, LoadAdError adError) {
        Log.d(
            TAG,
            String.format(
                "Rewarded preload ad %s failed to load with error: %s",
                preloadId, adError.getMessage()));
      }

      @Override
      public void onAdsExhausted(String preloadId) {
        Log.i(TAG, "Rewarded preload ad " + preloadId + " is not available");
      }

      @Override
      public void onAdPreloaded(String preloadId, ResponseInfo responseInfo) {
        Log.i(TAG, "Rewarded preload ad " + preloadId + " is available");
      }
    };

AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest);
RewardedAdPreloader.start(adUnitId, preloadConfig, preloadCallback);

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

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

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

Котлин

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

Java

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

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

The buffer size controls the number of preloaded ads held in memory. By default, Google optimizes buffer size to balance memory consumption and ad serving latency. You can set a custom buffer size to increase the number of ads kept in memory. We recommend a buffer size of two preloaded ads.

В следующем примере показано, как задать размер буфера:

Котлин

val adRequest = AdRequest.Builder(adUnitId).build()
// Define a PreloadConfiguration and set the buffer size to 2 preloaded ads.
val preloadConfig = PreloadConfiguration(adRequest, bufferSize = 2)
RewardedAdPreloader.start(adUnitId, preloadConfig)

Java

AdRequest adRequest = new AdRequest.Builder(adUnitId).build();
// Define a PreloadConfiguration and set the buffer size to 2 preloaded ads.
PreloadConfiguration preloadConfig = new PreloadConfiguration(adRequest, 2);
RewardedAdPreloader.start(adUnitId, preloadConfig);

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

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

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

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

If you don't need to show ads for a specific preload ID again in the session, you can stop preloading ads. To stop loading ads for a specific preload ID, call the destroy method with a preload ID. Calling the destroy method removes all preloaded ads associated with the preload ID from the cache.

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

Котлин

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

Java

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

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

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

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

Котлин

val responseInfo = RewardedAdPreloader.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 = RewardedAdPreloader.peekAdResponseInfo(preloadId);
if (responseInfo == null) {
  Log.e(TAG, "Failed to peek ad response info.");
  return;
}

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