This guide explains how to integrate rewarded ads into an Android app.
Before you begin
Before you continue, do the following:
- Set up GMA Next-Gen SDK.
- Use the test rewarded ad
unit ID
/21775744923/example/rewarded.- When building and testing your app, make sure that you use test ads rather than live, production ads. If you don't use the test ad unit ID, Google can suspend your account.
- Before you publish your app, replace this ID with your ad unit ID.
- For details on GMA Next-Gen SDK test ads, see Enable test ads.
Understand ad preloading (beta)
Ad preloading in GMA Next-Gen SDK automates ad loading and caching.
Ad preloading provides the following benefits:
- Reference management: maintains references until ads are shown.
- Automatic reloading: loads a new ad when one is retrieved from the cache.
- Managed retries: loads a new ad when one fails to load.
- Expiration handling: refreshes ads before expiring.
- Cache optimization: optimizes the cache order to deliver the highest priority ad.
Start ad preloading
To begin preloading ads, call the start method once
when you initialize GMA Next-Gen SDK. After you call the
start method, GMA Next-Gen SDK automatically preloads ads
and retries failed requests for preloaded configurations.
The following example shows how to start preloading ads:
Kotlin
Java
Replace AD_UNIT_ID with your 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.
Ad preloading doesn't support changing targeting parameters or ad requests. If you need to change targeting parameters between requests, use single loading.
Get and show the preloaded ad
Before showing the ad, call the pollAd method.
Don't store the preloaded ad object. When you 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.
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:
Kotlin
Java
When your app reaches an ad placement and can call the show method, call the
pollAd method. Don't call the
pollAd method in preload callbacks or after checking the
isAdAvailable method to hold an ad. If you need
to inspect ad metadata before showing the ad,
read the response info without removing the ad from the cache.
Listen to ad events
Before showing the ad, listen to ad events. The following example registers callbacks for ad events:
Kotlin
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. } }); }
Optional: Validate server-side verification (SSV) callbacks
To pass user and application context in server-side verification (SSV) callbacks, set verification options on the ad object before showing the ad. Because SSV callbacks arrive at your server from Google without session state, attach the following optional strings. Google forwards these strings unchanged as signed query parameters in the SSV callback.
user_idquery parameter: Identifies the user to credit, such as an internal account ID.custom_dataquery parameter: Carries app data, such as the reward placement, game level, or a server-generated nonce.
If you don't set a value, Google omits that query parameter from the SSV callback.
The following example sets custom data on an ad object before showing the ad:
Kotlin
Java
Replace SAMPLE_CUSTOM_DATA_STRING with your custom
data.
Key point: The custom_data query parameter is
percent-encoded. Before you
parse the value, URL-decode the string on your server and verify the callback
signature before trusting the user_id or custom_data query parameters.
Optional: Listen to preloading events
When you start preloading ads, register for preload events to get notified when ads are preloaded successfully, fail to preload, or the ad cache is exhausted.
The following example shows how to register for preloading ad events:
Kotlin
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);
When an ad fails to load, GMA Next-Gen SDK automatically preloads ads and retries
failed requests for preloaded configurations. Don't invoke manual load
requests in failure callbacks. In preloading event callback methods, don't
call the pollAd, destroy, or
start methods. Calling these methods in callbacks
can invoke recursive load loops.
Optional: Check for ad availability
If you need to know whether an ad is available, check for ad availability. The following example checks whether a preloaded ad is available:
Kotlin
private fun isAdAvailable(adUnitId: String): Boolean { return RewardedAdPreloader.isAdAvailable(adUnitId) }
Java
private boolean isAdAvailable(String adUnitId) { return RewardedAdPreloader.isAdAvailable(adUnitId); }
Optional: Set the buffer size
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 or decrease the number of ads kept in memory. We recommend a buffer size of two preloaded ads. If most of your traffic comes from low-memory devices, reduce the buffer size.
The following example shows how to set a buffer size:
Kotlin
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);
Preload cache limits
GMA Next-Gen SDK enforces an app-wide limit on the total number of preloaded ads across all ad units and preload IDs:
- Default limit: Google holds a maximum of six preloaded ads in memory. This limit is shared across all formats and preload IDs.
- We recommend keeping a buffer size of two for each preload ID.
Optional: Stop preloading ads
Keep preloading active while your app serves ads. During this time, don't the
destroy method. 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.
The following example shows how to stop preloading ads:
Kotlin
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); }
Optional: Read the response info
Read the next preloaded ad's response info without removing the ad from the
cache. If you need to inspect ad metadata before you show an ad,
read the response info instead of calling the pollAd
method.
The following example shows how to read the next preloaded ad response info:
Kotlin
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());