メインコンテンツまでスキップ

動画リワード広告


動画リワード広告とは

動画リワード広告とは、アプリ内で使用可能なアイテムやポイントをユーザーに付与する代わりに、約15秒〜30秒程度の動画広告を表示する広告フォーマットです。
強制視聴型の動画広告と違い、動画視聴を希望したユーザーにのみインセンティブを付与する点で、一般的な動画広告とは異なるものです。

動画視聴後に付与する報酬(インセンティブ)の例としては、ゲーム内で使えるアイテムやコンティニューの権利、ツール系アプリの場合は有料の機能を限定的に開放するなどがあります。

実装手順

前提条件

  • VAMP SDKがインポート済み

※まだVAMP SDKのインポートがお済みでない場合はこちらをご参考ください。

2025-02-03 VAMP v5.3.1でsetHyperIDMode機能が削除されました。

VAMP v4.4.2以前の導入手順はこちらをご参照ください。

広告を取得する

次のコードスニペットでは、MainActivityonCreateメソッド内で広告の取得を開始しています。

Java

import jp.supership.vamp.VAMPError;
import jp.supership.vamp.VAMPRequest;
import jp.supership.vamp.VAMPRewardedAd;
import jp.supership.vamp.VAMPRewardedAdLoadListener;

public class MainActivity extends AppCompatActivity {

private static final String VAMP_AD_ID = "*****";

@Override
protected void onCreate(Bundle savedInstanceState) {
...//広告の取得を開始します。
VAMPRewardedAd.load(this,
VAMP_AD_ID,
new VAMPRequest.Builder().build(),
new VAMPRewardedAdLoadListener() {
@Override
public void onReceived(@NonNull String placementId) {
//動画表示の準備が完了しました。
}

@Override
public void onFailedToLoad(@NonNull String placementId,
VAMPError error) {
//広告が取得できなかったときに通知されます。
}
});
}
}

Kotlin

import jp.supership.vamp.*

const val VAMP_AD_ID = "*****"

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
...//広告の取得を開始します。
VAMPRewardedAd.load(
this,
VAMP_AD_ID,
VAMPRequest.Builder().build(),
object : VAMPRewardedAdLoadListener {
override fun onReceived(placementId: String) {
//動画表示の準備が完了しました。
}

override fun onFailedToLoad(placementId: String,
error: VAMPError?) {
//広告が取得できなかったときに通知されます。
}
}
)
}
}

*****にAdGenerationの広告枠IDを設定して実装してください。

VAMPRewardedAdクラスのloadクラスメソッドに広告枠ID(コードスニペットではVAMP_AD_ID)を渡して、広告の取得を開始します。 VAMPRewardedAdLoadListenerインタフェースを実装し、第4引数に渡すことで、ロードイベントを受け取ることができます。

ロードイベントの詳細については、以下の表をご覧ください。

メソッド名説明
onReceived広告の取得に成功すると通知されます。このイベントを受け取ると、広告の表示が可能になります。
onFailedToLoad広告の取得に失敗すると通知されます。広告取得時のタイムアウトや、全てのアドネットワークの在庫がない場合など。

VAMPRewardedAdListenerを実装する

広告の表示に関するイベントはVAMPRewardedAdListenerインタフェースを実装することで処理できます。以下のクラスは表示に関するイベントを通知する仕組みを提供します。

  • VAMPEventDispatcher
  • VAMPActivityEventDispatcher

VAMPRewardedAdListenerインタフェースの実装をaddListenerメソッドで登録することで、イベントを処理できます。

Java

import jp.supership.vamp.VAMPError;
import jp.supership.vamp.VAMPEventDispatcher;
import jp.supership.vamp.VAMPRewardedAdListener;

public class MainActivity extends AppCompatActivity {

private static final String VAMP_AD_ID = "*****";

@Override
protected void onCreate(Bundle savedInstanceState) {
...
// 広告の表示に関するイベントを受け取るために
// VAMPRewardedAdListenerを登録します。
VAMPEventDispatcher.getInstance()
.addListener(VAMP_AD_ID, rewardedAdListener);
}

private final VAMPRewardedAdListener rewardedAdListener =
new VAMPRewardedAdListener() {
@Override
public void onFailedToShow(@NonNull String placementId, VAMPError error) {
// 広告表示失敗
// showを実行したが、何らかの理由で広告表示が失敗したときに通知されます。

// エラーにはユーザキャンセルも含まれます。
if (error == VAMPError.USER_CANCEL) {
// ユーザが広告再生を途中でキャンセルしました。
}
}

@Override
public void onCompleted(@NonNull String placementId) {
// インセンティブ付与が可能になったタイミングで通知されます。
}

@Override
public void onOpened(@NonNull String placementId) {
// 動画が表示されたタイミングで通知されます。
}

@Override
public void onClosed(@NonNull String placementId, boolean clicked) {
// 動画プレイヤーやエンドカードが閉じられたタイミングで通知されます。
// <注意:ユーザキャンセルなども含むので、
// インセンティブ付与はonCompletedで判定してください>
}

@Override
public void onExpired(@NonNull String placementId) {
// 有効期限オーバーのときに通知されます。
// <注意:onReceivedを受けてからの有効期限が切れました。
// showするには再度loadを行う必要が有ります>
}
};
}

Kotlin

import jp.supership.vamp.*

const val VAMP_AD_ID = "*****"

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
...
// 広告の表示に関するイベントを受け取るために
// VAMPRewardedAdListenerを登録します。
VAMPEventDispatcher.getInstance()
.addListener(VAMP_AD_ID, rewardedAdListener)
}

private val rewardedAdListener: VAMPRewardedAdListener =
object : VAMPRewardedAdListener {
override fun onFailedToShow(placementId: String, error: VAMPError) {
// 広告表示失敗
// showを実行したが、何らかの理由で広告表示が失敗したときに通知されます。

// エラーにはユーザキャンセルも含まれます。
if (error == VAMPError.USER_CANCEL) {
// ユーザが広告再生を途中でキャンセルしました。
}
}

override fun onCompleted(placementId: String) {
// インセンティブ付与が可能になったタイミングで通知されます。
}

override fun onOpened(placementId: String) {
// 動画が表示されたタイミングで通知されます。
}

override fun onClosed(placementId: String, clicked: Boolean) {
// 動画プレイヤーやエンドカードが閉じられたタイミングで通知されます。
// <注意:ユーザキャンセルなども含むので、
// インセンティブ付与はonCompletedで判定してください>
}

override fun onExpired(placementId: String) {
// 有効期限オーバーのときに通知されます。
// <注意:onReceivedを受けてからの有効期限が切れました。
// showするには再度loadを行う必要が有ります>
}
}
}

広告の表示に関するイベントの詳細については、以下の表をご覧ください。

Note

表示中のイベント(onOpened, onCompleted)の発生タイミングはアドネットワークにより異なります。
また、onClosedclickedフラグがtrue となる条件もアドネットワークにより異なります。

メソッド名説明
onFailedToShow広告の表示に失敗すると通知されます。視聴完了する前にユーザがキャンセルするなど。
onOpened広告が表示されると通知されます。アドネットワークから表示開始時(表示開始の通知がなければ、表示開始直前)のイベントを受け取ったタイミングで通知されます。アドネットワークによって発生タイミングが異なります。
onCompletedインセンティブ付与が可能になると通知されます。ユーザが途中で動画視聴をキャンセルすると発生しません。アドネットワークによって発生タイミングが異なります。
onClosed広告(動画プレーヤー、またはエンドカード)が閉じられると通知されます。ユーザキャンセルの場合でも広告を閉じたタイミングで通知されます。
onExpiredRTBはロードが完了してから1時間経過すると、広告表示ができても無効扱いとなり、収益が発生しません。このイベントを受け取ったらVAMPRewardedAd.loadメソッドを再度呼び出してください。イベントを受け取ってからVAMPRewardedAd.ofメソッドを実行するとnull が返却されます。

広告の表示に関するイベントを受け取る必要がなくなったタイミングでremoveListenerメソッドを呼んでください。以下のコードスニペットでは、MainActivityonDestroyメソッドでリスナーの解除をしています。

Java

public class MainActivity extends AppCompatActivity {

@Override
protected void onDestroy() {
// VAMPRewardedAdListenerを解除します。
VAMPEventDispatcher.getInstance().removeListener(VAMP_AD_ID);

super.onDestroy();
}
}

Kotlin

class MainActivity : AppCompatActivity() {

override fun onDestroy() {
// VAMPRewardedAdListenerを解除します。
VAMPEventDispatcher.getInstance().removeListener(VAMP_AD_ID)

super.onDestroy()
}
}
Note

複数の広告枠IDがあるアプリでは、それぞれの広告枠IDに対してaddListenerおよびremoveListenerメソッドを呼んでください。

Activityのライフサイクルにリスナーをバインドする

以下のコードスニペットのように、VAMPActivityEventDispatcherActivityのライフサイクルコールバック内で呼ぶことで、広告の表示に関するイベントを処理することもできます。

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 広告の表示に関するイベントを受け取るために
// VAMPRewardedAdListenerを登録します。
VAMPActivityEventDispatcher.getInstance()
.onCreate(savedInstanceState, VAMP_AD_ID, rewardedAdListener);
}

@Override
protected void onDestroy() {
// VAMPRewardedAdListenerを解除します。
VAMPActivityEventDispatcher.getInstance()
.onDestroy(VAMP_AD_ID);

super.onDestroy();
}

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
// VAMPActivityEventDispatcher#onCreate、
// VAMPActivityEventDispatcher#onDestroy、および
// VAMPActivityEventDispatcher#onSaveInstanceStateメソッドをそれぞれ呼ぶことで、
// 広告の表示中にActivityが破棄された後、再生成された場合でも
// 広告の表示に関するイベントを受け取ることができます。
VAMPActivityEventDispatcher.getInstance()
.onSaveInstanceState(outState, VAMP_AD_ID);

super.onSaveInstanceState(outState);
}

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// 広告の表示に関するイベントを受け取るために
// VAMPRewardedAdListenerを登録します。
VAMPActivityEventDispatcher.getInstance()
.onCreate(savedInstanceState, VAMP_AD_ID, rewardedAdListener)
}

override fun onDestroy() {
// VAMPRewardedAdListenerを解除します。
VAMPActivityEventDispatcher.getInstance()
.onDestroy(VAMP_AD_ID)
}

override fun onSaveInstanceState(outState: Bundle) {
// VAMPActivityEventDispatcher#onCreate、
// VAMPActivityEventDispatcher#onDestroy、および
// VAMPActivityEventDispatcher#onSaveInstanceStateメソッドをそれぞれ呼ぶことで、
// 広告の表示中にActivityが破棄された後、再生成された場合でも
// 広告の表示に関するイベントを受け取ることができます。
VAMPActivityEventDispatcher.getInstance()
.onSaveInstanceState(outState, VAMP_AD_ID)
}

広告を表示する

Java

VAMPRewardedAd rewardedAd = VAMPRewardedAd.of(VAMP_AD_ID);

// 広告の表示準備ができているか確認します。
// rewardedAdオブジェクトがnullでなければ、表示の準備ができています。
if (rewardedAd != null) {
// 準備が完了していた場合、動画広告を再生します。
rewardedAd.show(MainActivity.this);
}

Kotlin

val rewardedAd = VAMPRewardedAd.of(VAMP_AD_ID)

// 広告の表示準備ができているか確認します。
// rewardedAdオブジェクトがnullでなければ、表示の準備ができています。
if (rewardedAd != null) {
// 準備が完了していた場合、動画広告を再生します。
rewardedAd.show(this)
}

ロードが完了したVAMPRewardedAdオブジェクトはVAMPRewardedAd.ofクラスメソッドで取得できます。このクラスメソッドは指定した広告枠IDの広告が表示できる状態になっているとき、VAMPRewardedAdオブジェクトを返し、それ以外のときはnull を返します。

詳細なロードイベントを受け取る

VAMPRewardedAdLoadListenerインタフェースの代わりにVAMPRewardedAdLoadAdvancedListenerインタフェースを実装することにより、より詳細なロードイベントを受け取ることができます。

Java

import jp.supership.vamp.VAMPError;
import jp.supership.vamp.VAMPRequest;
import jp.supership.vamp.VAMPRewardedAd;
import jp.supership.vamp.VAMPRewardedAdLoadAdvancedListener;

public class MainActivity extends AppCompatActivity {

private static final String VAMP_AD_ID = "*****";

@Override
protected void onCreate(Bundle savedInstanceState) {
...
VAMPRewardedAd.load(this,
VAMP_AD_ID,
new VAMPRequest.Builder().build(),
new VAMPRewardedAdLoadAdvancedListener() {
@Override
public void onReceived(@NonNull String placementId) {
}

@Override
public void onFailedToLoad(@NonNull String placementId,
VAMPError error) {
}

// 追加されたロードイベント

@Override
public void onStartedLoading(@NonNull String placementId,
@NonNull String adNetworkName) {
// アドネットワークごとの広告取得が開始されたときに通知されます。
}

@Override
public void onLoaded(@NonNull String placementId,
@NonNull String adNetworkName,
boolean success,
@NonNull String message) {
// アドネットワークごとの広告取得結果が通知されます。
}
});
}
}

Kotlin

import jp.supership.vamp.*

const val VAMP_AD_ID = "*****"

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
...
VAMPRewardedAd.load(
this,
VAMP_AD_ID,
VAMPRequest.Builder().build(),
object : VAMPRewardedAdLoadAdvancedListener {
override fun onReceived(placementId: String) {
}

override fun onFailedToLoad(placementId: String,
error: VAMPError?) {
}

// 追加されたロードイベント

override fun onStartedLoading(placementId: String,
adNetworkName: String) {
// アドネットワークごとの広告取得が開始されたときに通知されます。
}

override fun onLoaded(
placementId: String,
adNetworkName: String,
success: Boolean,
message: String
) {
// アドネットワークごとの広告取得結果が通知されます。
}
}
)
}
}

VAMPRewardedAdLoadListenerインタフェースで受け取ることができるロードイベントに加え、以下のイベントを受け取ることができます。

メソッド名説明
onStartedLoadingアドネットワークごとの広告取得が開始されたときに通知されます。
onLoadedアドネットワークごとの広告取得結果が通知されます。このイベントは、ロードの成功時、失敗時どちらの場合も通知されます。このイベントをもとに広告の表示をしないでください。イベント通知により広告の表示準備ができているか判定する場合は、onReceivedを受け取ったタイミングで判定してください。