概要
リワード広告は、ユーザーが動画広告を最後まで視聴するとゲーム内通貨やライフ、ヒントなどの報酬を提供する全画面動画広告です。主な特徴
- 全画面を占める動画広告
- ユーザーが広告を完全に視聴した場合のみ報酬を提供
- ユーザーが自ら広告視聴を選択(例:「動画を見てライフをゲット」ボタン)
- 報酬タイプと数量を設定可能
開発環境ではテストユニットIDを使用してください:
PUBLIC_TEST_UNIT_ID_REWARDED実装方法
リワード広告は以下のステップで実装します:- AdropRewardedAdインスタンスを作成 - ユニットIDで広告オブジェクトを作成
- Listenerを設定 - 広告イベント処理のためのリスナーを指定
- 広告をロード -
load()メソッドで広告をリクエスト - 広告を表示 -
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)
ActivityまたはApplicationのContext
Adropコンソールで発行された広告ユニットID
プロパティ
広告ユニットID(読み取り専用)
広告がロードされて表示可能な状態かどうか(読み取り専用)
ロードされた広告のクリエイティブID(読み取り専用)
広告トランザクションID(読み取り専用)
広告キャンペーンID(読み取り専用)
バックフィル広告かどうか(読み取り専用)
広告イベントを受信するリスナー
メソッド
広告をリクエストします。広告ロード結果はリスナーの
onAdReceivedまたはonAdFailedToReceiveで受け取ります。広告を表示します。
activity:広告を表示するActivityuserDidEarnRewardHandler:報酬付与コールバック(type: Int, amount: Int) -> Unit
広告リソースを解放します。Activityの
onDestroy()で呼び出す必要があります。AdropRewardedAdListenerインターフェース
必須メソッド
広告受信に成功した時に呼び出されます。この時点から
show()メソッドで広告を表示できます。広告受信に失敗した時に呼び出されます。エラーコードで失敗原因を確認できます。
オプションメソッド
広告がインプレッションされた時に呼び出されます。
ユーザーが広告をクリックした時に呼び出されます。
広告画面が表示される直前に呼び出されます。BGMを一時停止するなどの処理ができます。
広告画面が完全に表示された後に呼び出されます。
広告画面が閉じる直前に呼び出されます。
広告画面が完全に閉じた後に呼び出されます。BGMを再開したり、次の広告を事前ロードできます。
広告表示に失敗した時に呼び出されます。エラーコードで失敗原因を確認できます。
報酬処理
報酬コールバック
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)