リワード広告

リワード広告は、ユーザーが広告を操作することと引き換えに、アプリ内で報酬を獲得できる広告です。 このガイドでは、AdMob のリワード広告を AdMob から Android アプリに統合する方法を説明します。 顧客の成功事例の紹介: 事例紹介 1 事例紹介 2

リワード広告の仕組みについては、下記のデモをご覧ください。このデモでは、シンプルなゲームに組み込まれた動画リワード広告の流れをご確認いただけます。

前提条件

  • Google Mobile Ads SDK 17.2.0 以降
  • スタートガイドの手順に沿って、Google Mobile Ads SDK をインポートし、Android マニフェストを更新していること

リワード広告のオブジェクトを作成する

リワード広告は、RewardedAd オブジェクトによってリクエストされ、表示されます。最初のステップは、RewardedAd をインスタンス化することです。これは次のコード スニペットの ActivityonCreate() メソッドで行われます。

Java

import com.google.android.gms.ads.rewarded.RewardedAd;

public class MainActivity extends Activity {

    private RewardedAd rewardedAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        rewardedAd = new RewardedAd(this,
            "ca-app-pub-3940256099942544/5224354917");
    }

}

Kotlin

import com.google.android.gms.ads.rewarded.RewardedAd

class MainActivity : Activity() {

  private lateinit var rewardedAd: RewardedAd

  override fun onCreate(savedInstanceState:Bundle) {
    ...
    rewardedAd = RewardedAd(this,
        "ca-app-pub-3940256099942544/5224354917")
  }
}

コンストラクタは、以下の引数を取ります。

常にテスト広告でテストする

アプリの開発とテストでは実際の広告ではなく、必ずテスト広告を使ってください。実際の広告でテストすると、アカウントが停止される場合があります。

下記の Android リワード広告向けのテスト専用広告ユニット ID を使うと、テスト広告を簡単に読み込むことができます。

ca-app-pub-3940256099942544/5224354917

これはすべてのリクエストに対してテスト広告を返す特別な ID で、アプリのコーディング、テスト、デバッグで自由にお使いいただけます。なお、テスト用 ID は、アプリを公開する前に必ずご自身の広告ユニット ID に置き換えてください。

Mobile Ads SDK のテスト広告の仕組みについて詳しくは、テスト広告でご確認いただけます。

広告を読み込む

リワード広告を読み込むには、RewardedAd オブジェクトの loadAd() メソッドを呼び出します。このメソッドでは、引数として AdRequestRewardedAdLoadCallback のインスタンスが使用されます。

Java

import com.google.android.gms.ads.rewarded.RewardedAd;

public class MainActivity extends Activity {

    private RewardedAd rewardedAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        rewardedAd = new RewardedAd(this,
            "ca-app-pub-3940256099942544/5224354917");

        RewardedAdLoadCallback adLoadCallback = new RewardedAdLoadCallback() {
            @Override
            public void onRewardedAdLoaded() {
                // Ad successfully loaded.
            }

           @Override
            public void onRewardedAdFailedToLoad(int errorCode) {
                // Ad failed to load.
            }
        };
        rewardedAd.loadAd(new AdRequest.Builder().build(), adLoadCallback);
    }
}

Kotlin

import com.google.android.gms.ads.rewarded.RewardedAd

class MainActivity : Activity() {

  private val rewardedAd: RewardedAd

  override fun onCreate(savedInstanceState:Bundle) {
    rewardedAd = RewardedAd(this, "ca-app-pub-3940256099942544/5224354917")
    val adLoadCallback = object: RewardedAdLoadCallback() {
      fun onRewardedAdLoaded() {
        // Ad successfully loaded.
      }
      fun onRewardedAdFailedToLoad(errorCode: Int) {
        // Ad failed to load.
      }
    }
    rewardedAd.loadAd(AdRequest.Builder().build(), adLoadCallback)
  }
}

RewardedAdLoadCallbackonRewardedAdLoaded() メソッドと onRewardedAdFailedToLoad() メソッドは、広告の読み込み操作の結果を提供します。

オーバーライド可能なメソッド
onRewardedAdLoaded() このメソッドは、広告の読み込みが完了したときに実行されます。
onRewardedAdFailedToLoad() このメソッドは、広告の読み込みが失敗したときに呼び出され、発生したエラーのタイプを表す errorCode パラメータが含まれます。このパラメータの値は、AdRequest クラスの定数として定義された、次のいずれかの値になります。
  • ERROR_CODE_INTERNAL_ERROR - 内部でエラーが発生しています(広告サーバーから無効な応答を受け取った場合など)。
  • ERROR_CODE_INVALID_REQUEST - 広告リクエストが無効です(広告ユニット ID が不正確だった場合など)。
  • ERROR_CODE_NETWORK_ERROR - ネットワーク接続が原因で広告のリクエストに失敗しました。
  • ERROR_CODE_NO_FILL - 広告リクエストは成功したものの、広告枠の不足が原因で広告が返されませんでした。

広告の表示

リワード広告をユーザーに表示する前に、リワード広告のコンテンツを視聴して報酬を受け取るかどうか、明確な選択肢をユーザーに提示する必要があります。リワード広告は、必ずユーザーの許可を受けてから表示しなければなりません。

RewardedAd を表示するには、isLoaded() メソッドを使用して読み込みが完了したことを確認してから、show() を呼び出します。 show() メソッドは、引数として ActivityRewardedAdCallback のインスタンスを取ります。Activity インスタンスは、リワード広告が表示されるアクティビティである必要があります。

先ほどのサンプルコードのリワード広告は、以下のようにボタンの OnClickListener に表示できます。

Java

myButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (rewardedAd.isLoaded()) {
            Activity activityContext = MainActivity.this
            RewardedAdCallback adCallback = new RewardedAdCallback() {
                @Override
                public void onRewardedAdOpened() {
                    // Ad opened.
                }

                @Override
                public void onRewardedAdClosed() {
                    // Ad closed.
                }

                @Override
                public void onUserEarnedReward(@NonNull RewardItem reward) {
                    // User earned reward.
                }

                @Override
                public void onRewardedAdFailedToShow(int errorCode) {
                    // Ad failed to display.
                }
            };
            rewardedAd.show(activityContext, adCallback);
        } else {
            Log.d("TAG", "The rewarded ad wasn't loaded yet.");
        }
    }
});

Kotlin

myButton.setOnClickListener {
  if (rewardedAd.isLoaded) {
    val activityContext: Activity = this@MainActivity
    val adCallback = object: RewardedAdCallback() {
      override fun onRewardedAdOpened() {
        // Ad opened.
      }
      override fun onRewardedAdClosed() {
        // Ad closed.
      }
      override fun onUserEarnedReward(@NonNull reward: RewardItem) {
        // User earned reward.
      }
      override fun onRewardedAdFailedToShow(errorCode: Int) {
        // Ad failed to display.
      }
    }
    rewardedAd.show(activityContext, adCallback)
  }
  else {
    Log.d("TAG", "The rewarded ad wasn't loaded yet.")
  }
}

広告イベント通知を受信する

show() メソッドに渡される RewardedAdCallback は、リワード広告のイベント通知を受け取ります。RewardedAdCallback のオーバーライド可能なメソッドは、それぞれリワード広告のライフサイクルで生じるイベントに対応しています。たとえば、onUserEarnedReward() メソッドを使用すると、ユーザーに報酬を提供するのに最適なタイミングを把握できます。各広告イベント メソッドについて詳しくは、以下の表をご覧ください。

オーバーライド可能なメソッド
onRewardedAdOpened() このメソッドは、広告がデバイスの画面いっぱいに表示されると呼び出されます。
onRewardedAdClosed() このメソッドは、ユーザーが「閉じる」アイコンまたは「戻る」ボタンをタップして、リワード広告を閉じるときに呼び出されます。アプリで音声出力やゲームループを一時停止している場合は、ここで再開すると効果的です。
onUserEarnedReward() このメソッドは、ユーザーが広告の操作に対して報酬を受け取る必要があるときに呼び出されます。広告ユニットで設定されている報酬の詳細情報を取得するには、RewardItem パラメータの getType() メソッドと getAmount() メソッドを使用します。
onRewardedAdFailedToShow() このメソッドは、広告の表示に失敗したときに呼び出されます。発生したエラーのタイプを表す errorCode パラメータが含まれます。このパラメータの値は、RewardedAdCallback クラスの定数として定義された、次のいずれかの値になります。
  • ERROR_CODE_INTERNAL_ERROR - 内部でエラーが発生しています。
  • ERROR_CODE_AD_REUSED - リワード広告はすでに 1 度表示されています。 RewardedAd は使い捨てオブジェクトであり、1 度しか表示できません。新しい広告を表示するには、RewardedAd のインスタンスを新たに生成して、読み込んでください。
  • ERROR_CODE_NOT_READY - 広告は正常に読み込まれませんでした。
  • ERROR_CODE_APP_NOT_FOREGROUND - アプリがフォアグラウンドで動作していない場合、広告は表示できません。

RewardedAdCallback を使用して次のリワード広告をプリロードする

RewardedAd は使い捨てオブジェクトです。つまり、リワード広告を一度表示すると、このオブジェクトを使って他の広告を読み込むことはできません。他のリワード広告をリクエストするには、新しい RewardedAd オブジェクトを作成します。

おすすめの方法は、RewardedAdCallbackonRewardedAdClosed() メソッドで別のリワード広告を読み込んでおき、前のリワード広告の表示が終了したらすぐに次のリワード広告の読み込みを開始できるようにすることです。

Java

public RewardedAd createAndLoadRewardedAd() {
        RewardedAd rewardedAd = new RewardedAd(this,
                "ca-app-pub-3940256099942544/5224354917");
        RewardedAdLoadCallback adLoadCallback = new RewardedAdLoadCallback() {
            @Override
            public void onRewardedAdLoaded() {
                // Ad successfully loaded.
            }

            @Override
            public void onRewardedAdFailedToLoad(int errorCode) {
                // Ad failed to load.
            }
        };
        rewardedAd.loadAd(new AdRequest.Builder().build(), adLoadCallback);
        return rewardedAd;
}

@Override
public void onRewardedAdClosed() {
    this.rewardedAd = createAndLoadRewardedAd();
}

Kotlin

fun createAndLoadRewardedAd(): RewardedAd {
  val rewardedAd = RewardedAd(this, "ca-app-pub-3940256099942544/5224354917")
  val adLoadCallback = object: RewardedAdLoadCallback() {
    override fun onRewardedAdLoaded() {
      // Ad successfully loaded.
    }
    override fun onRewardedAdFailedToLoad(errorCode: Int) {
      // Ad failed to load.
    }
  }
  rewardedAd.loadAd(AdRequest.Builder().build(), adLoadCallback)
  return rewardedAd
}
fun onRewardedAdClosed() {
  this.rewardedAd = createAndLoadRewardedAd()
}

複数のリワード広告を読み込む

複数のリワード広告を読み込むには、広告ごとにリワード広告のオブジェクトを作成するおよび広告を読み込むで説明されている手順を行います。次のコード スニペットは、2 つの異なる広告プレースメントに 2 つのリワード広告を読み込む方法を示しています。

Java

package ...

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.rewarded.RewardedAd;

public class MainActivity extends Activity {

    private RewardedAd gameOverRewardedAd;
    private RewardedAd extraCoinsRewardedAd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        gameOverRewardedAd = createAndLoadRewardedAd(
          "ca-app-pub-3940256099942544/5224354917");
        extraCoinsRewardedAd = createAndLoadRewardedAd(
          "ca-app-pub-3940256099942544/5224354917");
    }

    public RewardedAd createAndLoadRewardedAd(String adUnitId) {
        RewardedAd rewardedAd = new RewardedAd(this, adUnitId);
        RewardedAdLoadCallback adLoadCallback = new RewardedAdLoadCallback() {
            @Override
            public void onRewardedAdLoaded() {
                // Ad successfully loaded.
            }

            @Override
            public void onRewardedAdFailedToLoad(int errorCode) {
                // Ad failed to load.
            }
        };
        rewardedAd.loadAd(new AdRequest.Builder().build(), adLoadCallback);
        return rewardedAd;
    }
}

Kotlin

import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.rewarded.RewardedAd

class MainActivity: Activity() {

  private val gameOverRewardedAd:RewardedAd
  private val extraCoinsRewardedAd:RewardedAd

  override fun onCreate(savedInstanceState:Bundle) {
    ...
    gameOverRewardedAd = createAndLoadRewardedAd(
      "ca-app-pub-3940256099942544/5224354917")
    extraCoinsRewardedAd = createAndLoadRewardedAd(
      "ca-app-pub-3940256099942544/5224354917")
  }

  fun createAndLoadRewardedAd(adUnitId:String): RewardedAd {
    val rewardedAd = RewardedAd(this, adUnitId)
    val adLoadCallback = object: RewardedAdLoadCallback() {
      overrride fun onRewardedAdLoaded() {
        // Ad successfully loaded.
      }
      overrride fun onRewardedAdFailedToLoad(errorCode: Int) {
        // Ad failed to load.
      }
    }
    rewardedAd.loadAd(AdRequest.Builder().build(), adLoadCallback)
    return rewardedAd
  }
}

よくある質問

RewardedAd の報酬の詳細情報を取得することはできますか?
はい。onUserEarnedReward() コールバックが呼び出される前に報酬金額を確認する必要がある場合、RewardedAd では getRewardItem() メソッドを使って、広告の読み込み後に報酬金額の情報を取得することができます。
初期化の呼び出しでタイムアウトは発生しますか?
メディエーション ネットワークの初期化が完了していなくても、Google Mobile Ads SDK では 10 秒が経過すると OnInitializationCompleteListener が呼び出されます。
初期化コールバックを取得したときに対応準備が完了していないメディエーション ネットワークはどうなりますか?

広告は、OnInitializationCompleteListener のコールバック内で読み込むことが推奨されています。メディエーション ネットワークの対応準備が完了していなくても、Google Mobile Ads SDK はそのネットワークに対して広告を要求します。そのため、いったんタイムアウトされても、その後に初期化が完了すれば、メディエーション ネットワークはそのセッション中に発生する後続の広告リクエストに対応することができます。

MobileAds.getInitializationStatus() を呼び出せば、アプリ セッションの間、すべてのアダプタの初期化ステータスを継続的にポーリングすることができます。

特定のメディエーション ネットワークの対応準備が完了していない理由を確認するには、どうすればよいですか?

AdapterStatus.getDescription() を参照すると、アダプタが広告リクエストの処理に対応できない理由を確認できます。

次のステップ