メインコンテンツへスキップ

概要

リワード広告は、ユーザーが動画広告を最後まで視聴するとゲーム内通貨やライフ、ヒントなどの報酬を提供する全画面動画広告です。

主な特徴

  • 全画面を占める動画広告
  • ユーザーが広告を完全に視聴した場合のみ報酬を提供
  • ユーザーが自ら広告視聴を選択(例:「動画を見てライフをゲット」ボタン)
  • 報酬タイプと数量を設定可能
開発環境ではテストユニットIDを使用してください:PUBLIC_TEST_UNIT_ID_REWARDED

実装方法

リワード広告は以下のステップで実装します:
  1. AdropRewardedAdインスタンスを作成 - ユニットIDで広告オブジェクトを作成
  2. Listenerを設定 - 広告イベント処理のためのリスナーを指定
  3. 広告をロード - load()メソッドで広告をリクエスト
  4. 広告を表示 - show()メソッドで広告を表示し、報酬を処理

基本実装

Kotlinの例

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. AdropRewardedAdインスタンスを作成
        rewardedAd = AdropRewardedAd(this, "YOUR_UNIT_ID")

        // 2. Listenerを設定
        rewardedAd?.rewardedAdListener = object : AdropRewardedAdListener {
            // 必須:広告受信成功
            override fun onAdReceived(ad: AdropRewardedAd) {
                Log.d(TAG, "広告受信完了")
                // 広告視聴ボタンを有効化など
            }

            // 必須:広告受信失敗
            override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
                Log.d(TAG, "広告受信失敗: $errorCode")
                // 広告視聴ボタンを無効のままにするなど
            }

            // オプション:広告インプレッション
            override fun onAdImpression(ad: AdropRewardedAd) {
                Log.d(TAG, "広告インプレッション")
            }

            // オプション:広告クリック
            override fun onAdClicked(ad: AdropRewardedAd) {
                Log.d(TAG, "広告クリック")
            }

            // オプション:広告画面表示直前
            override fun onAdWillPresentFullScreen(ad: AdropRewardedAd) {
                Log.d(TAG, "広告画面表示予定")
                // BGMを一時停止など
            }

            // オプション:広告画面表示完了
            override fun onAdDidPresentFullScreen(ad: AdropRewardedAd) {
                Log.d(TAG, "広告画面表示完了")
            }

            // オプション:広告画面終了直前
            override fun onAdWillDismissFullScreen(ad: AdropRewardedAd) {
                Log.d(TAG, "広告画面終了予定")
            }

            // オプション:広告画面終了完了
            override fun onAdDidDismissFullScreen(ad: AdropRewardedAd) {
                Log.d(TAG, "広告画面終了")
                // BGMを再開など

                // 次の広告を事前ロード
                rewardedAd?.load()
            }

            // オプション:広告表示失敗
            override fun onAdFailedToShowFullScreen(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
                Log.d(TAG, "広告表示失敗: $errorCode")
            }
        }

        // 3. 広告をロード
        rewardedAd?.load()

        // 広告視聴ボタンのクリック処理
        findViewById<Button>(R.id.btnShowRewardedAd).setOnClickListener {
            showRewardedAd()
        }
    }

    private fun showRewardedAd() {
        // 広告がロードされているか確認
        if (rewardedAd?.isLoaded != true) {
            Log.d(TAG, "広告がまだロードされていません")
            return
        }

        // 4. 広告を表示し報酬を処理
        rewardedAd?.show(this) { type, amount ->
            // 報酬付与処理
            Log.d(TAG, "報酬獲得 - タイプ: $type, 数量: $amount")
            grantReward(type, amount)
        }
    }

    private fun grantReward(type: Int, amount: Int) {
        // ユーザーに報酬を付与
        // 例:ゲーム内通貨の追加、ライフの回復など

        // 重要:サーバー側での検証を推奨します
        // クライアントのみでの報酬処理は不正行為の対象となる可能性があります
    }

    override fun onDestroy() {
        super.onDestroy()
        rewardedAd?.destroy()
        rewardedAd = null
    }

    companion object {
        private const val TAG = "RewardedActivity"
    }
}

Javaの例

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. AdropRewardedAdインスタンスを作成
        rewardedAd = new AdropRewardedAd(this, "YOUR_UNIT_ID");

        // 2. Listenerを設定
        rewardedAd.setRewardedAdListener(new AdropRewardedAdListener() {
            // 必須:広告受信成功
            @Override
            public void onAdReceived(@NonNull AdropRewardedAd ad) {
                Log.d(TAG, "広告受信完了");
                // 広告視聴ボタンを有効化など
            }

            // 必須:広告受信失敗
            @Override
            public void onAdFailedToReceive(@NonNull AdropRewardedAd ad, @NonNull AdropErrorCode errorCode) {
                Log.d(TAG, "広告受信失敗: " + errorCode);
                // 広告視聴ボタンを無効のままにするなど
            }

            // オプション:広告インプレッション
            @Override
            public void onAdImpression(@NonNull AdropRewardedAd ad) {
                Log.d(TAG, "広告インプレッション");
            }

            // オプション:広告クリック
            @Override
            public void onAdClicked(@NonNull AdropRewardedAd ad) {
                Log.d(TAG, "広告クリック");
            }

            // オプション:広告画面表示直前
            @Override
            public void onAdWillPresentFullScreen(@NonNull AdropRewardedAd ad) {
                Log.d(TAG, "広告画面表示予定");
                // BGMを一時停止など
            }

            // オプション:広告画面表示完了
            @Override
            public void onAdDidPresentFullScreen(@NonNull AdropRewardedAd ad) {
                Log.d(TAG, "広告画面表示完了");
            }

            // オプション:広告画面終了直前
            @Override
            public void onAdWillDismissFullScreen(@NonNull AdropRewardedAd ad) {
                Log.d(TAG, "広告画面終了予定");
            }

            // オプション:広告画面終了完了
            @Override
            public void onAdDidDismissFullScreen(@NonNull AdropRewardedAd ad) {
                Log.d(TAG, "広告画面終了");
                // BGMを再開など

                // 次の広告を事前ロード
                rewardedAd.load();
            }

            // オプション:広告表示失敗
            @Override
            public void onAdFailedToShowFullScreen(@NonNull AdropRewardedAd ad, @NonNull AdropErrorCode errorCode) {
                Log.d(TAG, "広告表示失敗: " + errorCode);
            }
        });

        // 3. 広告をロード
        rewardedAd.load();

        // 広告視聴ボタンのクリック処理
        findViewById(R.id.btnShowRewardedAd).setOnClickListener(v -> showRewardedAd());
    }

    private void showRewardedAd() {
        // 広告がロードされているか確認
        if (!rewardedAd.isLoaded()) {
            Log.d(TAG, "広告がまだロードされていません");
            return;
        }

        // 4. 広告を表示し報酬を処理
        rewardedAd.show(this, (type, amount) -> {
            // 報酬付与処理
            Log.d(TAG, "報酬獲得 - タイプ: " + type + ", 数量: " + amount);
            grantReward(type, amount);
        });
    }

    private void grantReward(int type, int amount) {
        // ユーザーに報酬を付与
        // 例:ゲーム内通貨の追加、ライフの回復など

        // 重要:サーバー側での検証を推奨します
        // クライアントのみでの報酬処理は不正行為の対象となる可能性があります
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (rewardedAd != null) {
            rewardedAd.destroy();
            rewardedAd = null;
        }
    }
}

AdropRewardedAdクラス

コンストラクタ

AdropRewardedAd(context: Context, unitId: String)
context
Context
ActivityまたはApplicationのContext
unitId
String
Adropコンソールで発行された広告ユニットID

プロパティ

unitId
String
広告ユニットID(読み取り専用)
isLoaded
Boolean
広告がロードされて表示可能な状態かどうか(読み取り専用)
creativeId
String
ロードされた広告のクリエイティブID(読み取り専用)
txId
String
広告トランザクションID(読み取り専用)
campaignId
String
広告キャンペーンID(読み取り専用)
isBackfilled
Boolean
バックフィル広告かどうか(読み取り専用)
rewardedAdListener
AdropRewardedAdListener?
広告イベントを受信するリスナー

メソッド

load()
Unit
広告をリクエストします。広告ロード結果はリスナーのonAdReceivedまたはonAdFailedToReceiveで受け取ります。
show(activity, userDidEarnRewardHandler)
Unit
広告を表示します。
  • activity:広告を表示するActivity
  • userDidEarnRewardHandler:報酬付与コールバック (type: Int, amount: Int) -> Unit
destroy()
Unit
広告リソースを解放します。ActivityのonDestroy()で呼び出す必要があります。

AdropRewardedAdListenerインターフェース

必須メソッド

onAdReceived(ad: AdropRewardedAd)
void
広告受信に成功した時に呼び出されます。この時点からshow()メソッドで広告を表示できます。
onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode)
void
広告受信に失敗した時に呼び出されます。エラーコードで失敗原因を確認できます。

オプションメソッド

onAdImpression(ad: AdropRewardedAd)
void
広告がインプレッションされた時に呼び出されます。
onAdClicked(ad: AdropRewardedAd)
void
ユーザーが広告をクリックした時に呼び出されます。
onAdWillPresentFullScreen(ad: AdropRewardedAd)
void
広告画面が表示される直前に呼び出されます。BGMを一時停止するなどの処理ができます。
onAdDidPresentFullScreen(ad: AdropRewardedAd)
void
広告画面が完全に表示された後に呼び出されます。
onAdWillDismissFullScreen(ad: AdropRewardedAd)
void
広告画面が閉じる直前に呼び出されます。
onAdDidDismissFullScreen(ad: AdropRewardedAd)
void
広告画面が完全に閉じた後に呼び出されます。BGMを再開したり、次の広告を事前ロードできます。
onAdFailedToShowFullScreen(ad: AdropRewardedAd, errorCode: AdropErrorCode)
void
広告表示に失敗した時に呼び出されます。エラーコードで失敗原因を確認できます。

報酬処理

報酬コールバック

show()メソッドのuserDidEarnRewardHandlerパラメータで報酬コールバックを渡します。
rewardedAd?.show(this) { type, amount ->
    // type:報酬タイプ(Int)
    // amount:報酬数量(Int)
    Log.d(TAG, "報酬獲得 - タイプ: $type, 数量: $amount")
    grantReward(type, amount)
}

報酬タイプと数量

  • type:Adropコンソールで設定した報酬タイプ(整数値)
  • amount:Adropコンソールで設定した報酬数量(整数値)

ベストプラクティス

1. 広告を事前ロード

ユーザー体験のために広告を事前にロードしておくことをお勧めします。
class GameActivity : AppCompatActivity() {
    private var rewardedAd: AdropRewardedAd? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_game)

        // 画面進入時に広告を事前ロード
        loadRewardedAd()
    }

    private fun loadRewardedAd() {
        rewardedAd = AdropRewardedAd(this, "YOUR_UNIT_ID")
        rewardedAd?.rewardedAdListener = object : AdropRewardedAdListener {
            override fun onAdReceived(ad: AdropRewardedAd) {
                Log.d(TAG, "広告準備完了")
            }

            override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
                Log.d(TAG, "広告ロード失敗: $errorCode")
            }

            override fun onAdDidDismissFullScreen(ad: AdropRewardedAd) {
                // 広告終了後に次の広告を事前ロード
                loadRewardedAd()
            }
        }
        rewardedAd?.load()
    }

    private fun showRewardedAd() {
        rewardedAd?.show(this) { type, amount ->
            grantReward(type, amount)
        }
    }
}

2. 広告準備状態の確認

広告がロードされているか確認し、UIを更新します。
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) "動画を見てライフをゲット" else "広告ロード中..."
        }
    }

    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()

            // 次の広告をロード
            rewardedAd?.load()
        }
    }
}

3. BGM処理

広告表示前後で適切にBGMを制御します。
private val adListener = object : AdropRewardedAdListener {
    override fun onAdReceived(ad: AdropRewardedAd) {
        // 必須実装
    }

    override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
        // 必須実装
    }

    override fun onAdWillPresentFullScreen(ad: AdropRewardedAd) {
        // 広告表示直前にBGMを一時停止
        AudioManager.pauseBackgroundMusic()
    }

    override fun onAdDidDismissFullScreen(ad: AdropRewardedAd) {
        // 広告終了後にBGMを再開
        AudioManager.resumeBackgroundMusic()
    }
}

4. エラー処理

広告ロード失敗時にリトライロジックを実装します。
private val adListener = object : AdropRewardedAdListener {
    override fun onAdReceived(ad: AdropRewardedAd) {
        Log.d(TAG, "広告ロード成功")
    }

    override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
        Log.d(TAG, "広告ロード失敗: $errorCode")

        // ネットワークエラーの場合リトライ
        if (errorCode == AdropErrorCode.ERROR_CODE_NETWORK) {
            Handler(Looper.getMainLooper()).postDelayed({
                rewardedAd?.load()
            }, 3000)
        }
    }

    override fun onAdFailedToShowFullScreen(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
        Log.d(TAG, "広告表示失敗: $errorCode")

        // ユーザーに通知
        Toast.makeText(
            this@GameActivity,
            "広告を表示できません。後でもう一度お試しください。",
            Toast.LENGTH_SHORT
        ).show()
    }
}

5. ライフサイクル管理

Activity終了時に広告リソースを整理します。
class GameActivity : AppCompatActivity() {
    private var rewardedAd: AdropRewardedAd? = null

    override fun onDestroy() {
        super.onDestroy()
        rewardedAd?.destroy()
        rewardedAd = null
    }
}

完全な例

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()
        }

        // 広告を事前ロード
        loadRewardedAd()
    }

    private fun loadRewardedAd() {
        rewardedAd = AdropRewardedAd(this, "PUBLIC_TEST_UNIT_ID_REWARDED")
        rewardedAd?.rewardedAdListener = object : AdropRewardedAdListener {
            override fun onAdReceived(ad: AdropRewardedAd) {
                Log.d(TAG, "広告受信完了")
                isAdReady = true
                updateButtonState()
            }

            override fun onAdFailedToReceive(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
                Log.d(TAG, "広告受信失敗: $errorCode")
                isAdReady = false
                updateButtonState()

                // ネットワークエラーの場合3秒後にリトライ
                if (errorCode == AdropErrorCode.ERROR_CODE_NETWORK) {
                    Handler(Looper.getMainLooper()).postDelayed({
                        rewardedAd?.load()
                    }, 3000)
                }
            }

            override fun onAdImpression(ad: AdropRewardedAd) {
                Log.d(TAG, "広告インプレッション")
            }

            override fun onAdClicked(ad: AdropRewardedAd) {
                Log.d(TAG, "広告クリック")
            }

            override fun onAdWillPresentFullScreen(ad: AdropRewardedAd) {
                Log.d(TAG, "広告画面表示予定")
                // BGMを一時停止
                pauseBackgroundMusic()
            }

            override fun onAdDidPresentFullScreen(ad: AdropRewardedAd) {
                Log.d(TAG, "広告画面表示完了")
            }

            override fun onAdWillDismissFullScreen(ad: AdropRewardedAd) {
                Log.d(TAG, "広告画面終了予定")
            }

            override fun onAdDidDismissFullScreen(ad: AdropRewardedAd) {
                Log.d(TAG, "広告画面終了")
                isAdReady = false
                updateButtonState()

                // BGMを再開
                resumeBackgroundMusic()

                // 次の広告を事前ロード
                loadRewardedAd()
            }

            override fun onAdFailedToShowFullScreen(ad: AdropRewardedAd, errorCode: AdropErrorCode) {
                Log.d(TAG, "広告表示失敗: $errorCode")
                Toast.makeText(
                    this@GameActivity,
                    "広告を表示できません。後でもう一度お試しください。",
                    Toast.LENGTH_SHORT
                ).show()
            }
        }
        rewardedAd?.load()
    }

    private fun showRewardedAd() {
        if (!isAdReady) {
            Toast.makeText(this, "広告がまだロードされていません", Toast.LENGTH_SHORT).show()
            return
        }

        rewardedAd?.show(this) { type, amount ->
            Log.d(TAG, "報酬獲得 - タイプ: $type, 数量: $amount")
            grantReward(type, amount)
        }
    }

    private fun grantReward(type: Int, amount: Int) {
        // ユーザーに報酬を付与
        runOnUiThread {
            Toast.makeText(
                this,
                "報酬獲得!タイプ: $type, 数量: $amount",
                Toast.LENGTH_LONG
            ).show()
        }

        // 実際の報酬付与ロジックを実装
        // 例:ゲーム内通貨の追加、ライフの回復など
    }

    private fun updateButtonState() {
        btnWatchAd.isEnabled = isAdReady
        btnWatchAd.alpha = if (isAdReady) 1.0f else 0.5f
        btnWatchAd.text = if (isAdReady) "動画を見てライフをゲット" else "広告ロード中..."
    }

    private fun pauseBackgroundMusic() {
        // BGM一時停止ロジック
    }

    private fun resumeBackgroundMusic() {
        // BGM再開ロジック
    }

    override fun onDestroy() {
        super.onDestroy()
        rewardedAd?.destroy()
        rewardedAd = null
    }

    companion object {
        private const val TAG = "GameActivity"
    }
}

テスト

テストユニットID

開発中は必ずテストユニットIDを使用してください。
// 開発環境
val rewardedAd = AdropRewardedAd(this, "PUBLIC_TEST_UNIT_ID_REWARDED")

// 本番環境
val rewardedAd = AdropRewardedAd(this, "YOUR_PRODUCTION_UNIT_ID")
実際のユニットIDでテストすると無効トラフィックとみなされ、アカウントが停止される可能性があります。必ずテストユニットIDを使用してください。

環境別ユニットID管理

ビルドタイプに応じて自動的にユニットIDを切り替える方法です。
object AdUnitID {
    val REWARDED: String
        get() = if (BuildConfig.DEBUG) {
            "PUBLIC_TEST_UNIT_ID_REWARDED"
        } else {
            "YOUR_PRODUCTION_UNIT_ID"
        }
}

// 使用
val rewardedAd = AdropRewardedAd(this, AdUnitID.REWARDED)

関連ドキュメント