Overview
Rewarded ads are full-screen video ads that provide users with rewards such as in-game currency, lives, or hints when they watch the ad to completion.
Key Features
- Full-screen video ads
- Rewards provided only when users watch the entire ad
- User-initiated ad viewing (e.g., “Watch video to get lives” button)
- Configurable reward type and amount
Use the test unit ID for development: PUBLIC_TEST_UNIT_ID_REWARDED
Implementation Steps
Rewarded ads are implemented in the following steps:
- Create AdropRewardedAd Instance - Create ad object with unit ID
- Set Listener - Configure listener for ad events
- Load Ad - Request ad with
load() method
- Show Ad - Display ad with
show() method and handle rewards
Basic Implementation
Kotlin Example
import io.adrop.ads.rewardedAd.AdropRewardedAd
import io.adrop.ads.rewardedAd.AdropRewardedAdListener
import io.adrop.ads.model.AdropErrorCode
class RewardedActivity : AppCompatActivity() {
private var rewardedAd: AdropRewardedAd? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_rewarded)
// 1. Create AdropRewardedAd instance
rewardedAd = AdropRewardedAd(this, "YOUR_UNIT_ID")
// 2. Set Listener
rewardedAd?.rewardedAdListener = object : AdropRewardedAdListener {
// Required: Ad received successfully
override fun onAdReceived(ad: AdropRewardedAd) {
Log.d(TAG, "Ad received")
// Enable watch ad button, etc.
}
// Required: Ad failed to receive
override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
Log.d(TAG, "Ad failed to receive: $errorCode")
// Keep watch ad button disabled, etc.
}
// Optional: Ad impression
override fun onAdImpression(ad: AdropRewardedAd) {
Log.d(TAG, "Ad impression")
}
// Optional: Ad clicked
override fun onAdClicked(ad: AdropRewardedAd) {
Log.d(TAG, "Ad clicked")
}
// Optional: Before showing full screen
override fun onAdWillPresentFullScreen(ad: AdropRewardedAd) {
Log.d(TAG, "Ad will present")
// Pause background music, etc.
}
// Optional: After showing full screen
override fun onAdDidPresentFullScreen(ad: AdropRewardedAd) {
Log.d(TAG, "Ad did present")
}
// Optional: Before closing full screen
override fun onAdWillDismissFullScreen(ad: AdropRewardedAd) {
Log.d(TAG, "Ad will dismiss")
}
// Optional: After closing full screen
override fun onAdDidDismissFullScreen(ad: AdropRewardedAd) {
Log.d(TAG, "Ad dismissed")
// Resume background music, etc.
// Preload next ad
rewardedAd?.load()
}
// Optional: Failed to show
override fun onAdFailedToShowFullScreen(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
Log.d(TAG, "Ad failed to show: $errorCode")
}
}
// 3. Load ad
rewardedAd?.load()
// Handle watch ad button click
findViewById<Button>(R.id.btnShowRewardedAd).setOnClickListener {
showRewardedAd()
}
}
private fun showRewardedAd() {
// Check if ad is loaded
if (rewardedAd?.isLoaded != true) {
Log.d(TAG, "Ad is not loaded yet")
return
}
// 4. Show ad and handle reward
rewardedAd?.show(this) { type, amount ->
// Process reward
Log.d(TAG, "Reward earned - type: $type, amount: $amount")
grantReward(type, amount)
}
}
private fun grantReward(type: Int, amount: Int) {
// Grant reward to user
// e.g., Add in-game currency, restore lives, etc.
}
override fun onDestroy() {
super.onDestroy()
rewardedAd?.destroy()
rewardedAd = null
}
companion object {
private const val TAG = "RewardedActivity"
}
}
Java Example
import io.adrop.ads.rewardedAd.AdropRewardedAd;
import io.adrop.ads.rewardedAd.AdropRewardedAdListener;
import io.adrop.ads.model.AdropErrorCode;
public class RewardedActivity extends AppCompatActivity {
private static final String TAG = "RewardedActivity";
private AdropRewardedAd rewardedAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rewarded);
// 1. Create AdropRewardedAd instance
rewardedAd = new AdropRewardedAd(this, "YOUR_UNIT_ID");
// 2. Set Listener
rewardedAd.setRewardedAdListener(new AdropRewardedAdListener() {
// Required: Ad received successfully
@Override
public void onAdReceived(@NonNull AdropRewardedAd ad) {
Log.d(TAG, "Ad received");
// Enable watch ad button, etc.
}
// Required: Ad failed to receive
@Override
public void onAdFailedToReceive(@NonNull AdropRewardedAd ad, @NonNull AdropErrorCode errorCode) {
Log.d(TAG, "Ad failed to receive: " + errorCode);
// Keep watch ad button disabled, etc.
}
// Optional: Ad impression
@Override
public void onAdImpression(@NonNull AdropRewardedAd ad) {
Log.d(TAG, "Ad impression");
}
// Optional: Ad clicked
@Override
public void onAdClicked(@NonNull AdropRewardedAd ad) {
Log.d(TAG, "Ad clicked");
}
// Optional: Before showing full screen
@Override
public void onAdWillPresentFullScreen(@NonNull AdropRewardedAd ad) {
Log.d(TAG, "Ad will present");
// Pause background music, etc.
}
// Optional: After showing full screen
@Override
public void onAdDidPresentFullScreen(@NonNull AdropRewardedAd ad) {
Log.d(TAG, "Ad did present");
}
// Optional: Before closing full screen
@Override
public void onAdWillDismissFullScreen(@NonNull AdropRewardedAd ad) {
Log.d(TAG, "Ad will dismiss");
}
// Optional: After closing full screen
@Override
public void onAdDidDismissFullScreen(@NonNull AdropRewardedAd ad) {
Log.d(TAG, "Ad dismissed");
// Resume background music, etc.
// Preload next ad
rewardedAd.load();
}
// Optional: Failed to show
@Override
public void onAdFailedToShowFullScreen(@NonNull AdropRewardedAd ad, @NonNull AdropErrorCode errorCode) {
Log.d(TAG, "Ad failed to show: " + errorCode);
}
});
// 3. Load ad
rewardedAd.load();
// Handle watch ad button click
findViewById(R.id.btnShowRewardedAd).setOnClickListener(v -> showRewardedAd());
}
private void showRewardedAd() {
// Check if ad is loaded
if (!rewardedAd.isLoaded()) {
Log.d(TAG, "Ad is not loaded yet");
return;
}
// 4. Show ad and handle reward
rewardedAd.show(this, (type, amount) -> {
// Process reward
Log.d(TAG, "Reward earned - type: " + type + ", amount: " + amount);
grantReward(type, amount);
});
}
private void grantReward(int type, int amount) {
// Grant reward to user
// e.g., Add in-game currency, restore lives, etc.
}
@Override
protected void onDestroy() {
super.onDestroy();
if (rewardedAd != null) {
rewardedAd.destroy();
rewardedAd = null;
}
}
}
AdropRewardedAd Class
Constructor
AdropRewardedAd(context: Context, unitId: String)
Activity or Application Context
Ad unit ID issued from the Adrop console
Properties
Whether the ad is loaded and ready to show (read-only)
Creative ID of the loaded ad (read-only)
Transaction ID of the ad (read-only)
Campaign ID of the ad (read-only)
Whether this is a backfill ad (read-only)
Listener for receiving ad events
Methods
Request an ad. Results are delivered via onAdReceived or onAdFailedToReceive callbacks.
show(activity, userDidEarnRewardHandler)
Show the ad.
activity: Activity to display the ad
userDidEarnRewardHandler: Reward callback (type: Int, amount: Int) -> Unit
Release ad resources. Must be called in Activity’s onDestroy().
AdropRewardedAdListener Interface
Required Methods
onAdReceived(ad: AdropRewardedAd)
Called when ad is successfully received. You can show the ad with show() from this point.
onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode)
Called when ad fails to load. Check the error code for the failure reason.
Optional Methods
onAdImpression(ad: AdropRewardedAd)
Called when ad impression is recorded.
onAdClicked(ad: AdropRewardedAd)
Called when user clicks the ad.
onAdWillPresentFullScreen(ad: AdropRewardedAd)
Called just before the ad screen is displayed. Good time to pause background music.
onAdDidPresentFullScreen(ad: AdropRewardedAd)
Called after the ad screen is fully displayed.
onAdWillDismissFullScreen(ad: AdropRewardedAd)
Called just before the ad screen closes.
onAdDidDismissFullScreen(ad: AdropRewardedAd)
Called after the ad screen is fully closed. Good time to resume background music or preload next ad.
onAdFailedToShowFullScreen(ad: AdropRewardedAd, errorCode: AdropErrorCode)
Called when ad fails to show. Check the error code for the failure reason.
Reward Handling
Reward Callback
Pass a reward callback as the userDidEarnRewardHandler parameter to the show() method.
rewardedAd?.show(this) { type, amount ->
// type: Reward type (Int)
// amount: Reward amount (Int)
Log.d(TAG, "Reward earned - type: $type, amount: $amount")
grantReward(type, amount)
}
Reward Type and Amount
- type: Reward type configured in Adrop console (integer value)
- amount: Reward amount configured in Adrop console (integer value)
Best Practices
1. Preload Ads
Preload ads for better user experience.
class GameActivity : AppCompatActivity() {
private var rewardedAd: AdropRewardedAd? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_game)
// Preload ad on screen entry
loadRewardedAd()
}
private fun loadRewardedAd() {
rewardedAd = AdropRewardedAd(this, "YOUR_UNIT_ID")
rewardedAd?.rewardedAdListener = object : AdropRewardedAdListener {
override fun onAdReceived(ad: AdropRewardedAd) {
Log.d(TAG, "Ad ready")
}
override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
Log.d(TAG, "Ad load failed: $errorCode")
}
override fun onAdDidDismissFullScreen(ad: AdropRewardedAd) {
// Preload next ad after closing
loadRewardedAd()
}
}
rewardedAd?.load()
}
private fun showRewardedAd() {
rewardedAd?.show(this) { type, amount ->
grantReward(type, amount)
}
}
}
2. Check Ad Ready State
Check if ad is loaded and update UI accordingly.
class GameActivity : AppCompatActivity() {
private var rewardedAd: AdropRewardedAd? = null
private var isAdReady = false
private fun updateButtonState() {
findViewById<Button>(R.id.btnWatchAd).apply {
isEnabled = isAdReady
alpha = if (isAdReady) 1.0f else 0.5f
text = if (isAdReady) "Watch Video for Lives" else "Loading Ad..."
}
}
private val adListener = object : AdropRewardedAdListener {
override fun onAdReceived(ad: AdropRewardedAd) {
isAdReady = true
updateButtonState()
}
override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
isAdReady = false
updateButtonState()
}
override fun onAdDidDismissFullScreen(ad: AdropRewardedAd) {
isAdReady = false
updateButtonState()
// Load next ad
rewardedAd?.load()
}
}
}
3. Background Music Handling
Control background music appropriately before and after ad display.
private val adListener = object : AdropRewardedAdListener {
override fun onAdReceived(ad: AdropRewardedAd) {
// Required implementation
}
override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
// Required implementation
}
override fun onAdWillPresentFullScreen(ad: AdropRewardedAd) {
// Pause background music before showing ad
AudioManager.pauseBackgroundMusic()
}
override fun onAdDidDismissFullScreen(ad: AdropRewardedAd) {
// Resume background music after ad closes
AudioManager.resumeBackgroundMusic()
}
}
4. Error Handling
Implement retry logic when ad loading fails.
private val adListener = object : AdropRewardedAdListener {
override fun onAdReceived(ad: AdropRewardedAd) {
Log.d(TAG, "Ad load success")
}
override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
Log.d(TAG, "Ad load failed: $errorCode")
// Retry on network error
if (errorCode == AdropErrorCode.ERROR_CODE_NETWORK) {
Handler(Looper.getMainLooper()).postDelayed({
rewardedAd?.load()
}, 3000)
}
}
override fun onAdFailedToShowFullScreen(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
Log.d(TAG, "Ad show failed: $errorCode")
// Notify user
Toast.makeText(
this@GameActivity,
"Cannot show ad. Please try again later.",
Toast.LENGTH_SHORT
).show()
}
}
5. Lifecycle Management
Clean up ad resources when Activity is destroyed.
class GameActivity : AppCompatActivity() {
private var rewardedAd: AdropRewardedAd? = null
override fun onDestroy() {
super.onDestroy()
rewardedAd?.destroy()
rewardedAd = null
}
}
Complete Example
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import io.adrop.ads.rewardedAd.AdropRewardedAd
import io.adrop.ads.rewardedAd.AdropRewardedAdListener
import io.adrop.ads.model.AdropErrorCode
class GameActivity : AppCompatActivity() {
private var rewardedAd: AdropRewardedAd? = null
private var isAdReady = false
private lateinit var btnWatchAd: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_game)
btnWatchAd = findViewById(R.id.btnWatchAd)
btnWatchAd.setOnClickListener {
showRewardedAd()
}
// Preload ad
loadRewardedAd()
}
private fun loadRewardedAd() {
rewardedAd = AdropRewardedAd(this, "PUBLIC_TEST_UNIT_ID_REWARDED")
rewardedAd?.rewardedAdListener = object : AdropRewardedAdListener {
override fun onAdReceived(ad: AdropRewardedAd) {
Log.d(TAG, "Ad received")
isAdReady = true
updateButtonState()
}
override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
Log.d(TAG, "Ad failed to receive: $errorCode")
isAdReady = false
updateButtonState()
// Retry after 3 seconds on network error
if (errorCode == AdropErrorCode.ERROR_CODE_NETWORK) {
Handler(Looper.getMainLooper()).postDelayed({
rewardedAd?.load()
}, 3000)
}
}
override fun onAdImpression(ad: AdropRewardedAd) {
Log.d(TAG, "Ad impression")
}
override fun onAdClicked(ad: AdropRewardedAd) {
Log.d(TAG, "Ad clicked")
}
override fun onAdWillPresentFullScreen(ad: AdropRewardedAd) {
Log.d(TAG, "Ad will present")
// Pause background music
pauseBackgroundMusic()
}
override fun onAdDidPresentFullScreen(ad: AdropRewardedAd) {
Log.d(TAG, "Ad did present")
}
override fun onAdWillDismissFullScreen(ad: AdropRewardedAd) {
Log.d(TAG, "Ad will dismiss")
}
override fun onAdDidDismissFullScreen(ad: AdropRewardedAd) {
Log.d(TAG, "Ad dismissed")
isAdReady = false
updateButtonState()
// Resume background music
resumeBackgroundMusic()
// Preload next ad
loadRewardedAd()
}
override fun onAdFailedToShowFullScreen(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
Log.d(TAG, "Ad failed to show: $errorCode")
Toast.makeText(
this@GameActivity,
"Cannot show ad. Please try again later.",
Toast.LENGTH_SHORT
).show()
}
}
rewardedAd?.load()
}
private fun showRewardedAd() {
if (!isAdReady) {
Toast.makeText(this, "Ad is not loaded yet", Toast.LENGTH_SHORT).show()
return
}
rewardedAd?.show(this) { type, amount ->
Log.d(TAG, "Reward earned - type: $type, amount: $amount")
grantReward(type, amount)
}
}
private fun grantReward(type: Int, amount: Int) {
// Grant reward to user
runOnUiThread {
Toast.makeText(
this,
"Reward earned! Type: $type, Amount: $amount",
Toast.LENGTH_LONG
).show()
}
// Implement actual reward logic
// e.g., Add in-game currency, restore lives, etc.
}
private fun updateButtonState() {
btnWatchAd.isEnabled = isAdReady
btnWatchAd.alpha = if (isAdReady) 1.0f else 0.5f
btnWatchAd.text = if (isAdReady) "Watch Video for Lives" else "Loading Ad..."
}
private fun pauseBackgroundMusic() {
// Pause background music logic
}
private fun resumeBackgroundMusic() {
// Resume background music logic
}
override fun onDestroy() {
super.onDestroy()
rewardedAd?.destroy()
rewardedAd = null
}
companion object {
private const val TAG = "GameActivity"
}
}
Testing
Test Unit ID
Always use test unit IDs during development.
// Development environment
val rewardedAd = AdropRewardedAd(this, "PUBLIC_TEST_UNIT_ID_REWARDED")
// Production environment
val rewardedAd = AdropRewardedAd(this, "YOUR_PRODUCTION_UNIT_ID")
Testing with actual unit IDs may be considered invalid traffic and could result in account suspension. Always use test unit IDs.
Environment-based Unit ID Management
Automatically switch unit IDs based on build type.
object AdUnitID {
val REWARDED: String
get() = if (BuildConfig.DEBUG) {
"PUBLIC_TEST_UNIT_ID_REWARDED"
} else {
"YOUR_PRODUCTION_UNIT_ID"
}
}
// Usage
val rewardedAd = AdropRewardedAd(this, AdUnitID.REWARDED)