Androidアプリに動画リワード広告を追加する

Audience Networkを利用すると、Android用アプリにFacebook広告を掲載して収益を生み出すことができます。動画リワード広告は、利用者が動画広告を視聴することの引き換えに、仮想通貨、アプリ内アイテム、限定コンテンツといった何らかの特典を得られる、フルスクリーンの広告サービスです。広告の長さは15~30秒で、スキップはできず、コールトゥアクションが備わったエンドカードが表示されます。動画の視聴が完了すると、利用者におすすめのリワードを付与するためのコールバックが届きます。

続行する前に、必ずAudience NetworkのスタートガイドAndroidのスタートガイドすべてに目を通しておいてください。

手順

ステップ1: Activityのリワード動画広告を初期化する

ステップ2: Activityのリワード動画広告を表示する

Audience Network SDKを初期化する

このメソッドは、Android Audience Network SDKバージョン5.1で追加されました。

バージョン5.3.0以降では、Audience Network Android SDKの明示的な初期化が必須です。Audience Network Android SDKを初期化する方法については、こちらのドキュメントをご覧ください。

広告オブジェクトを作成したり、広告を読み込んだりする前に、Audience Network SDKを初期化してください。アプリの起動時に初期化することをおすすめします。

public class YourApplication extends Application {
    ...
    @Override
    public void onCreate() {
        super.onCreate();
        // Initialize the Audience Network SDK
        AudienceNetworkAds.initialize(this);       
    }
    ...
}

ステップ1: Activityのリワード動画広告を初期化する

Facebook広告SDKをインポートするには、お使いのActivityの先頭に以下のコードを追加します。

import com.facebook.ads.*;

次に、動画リワードオブジェクトを初期化し、リスナーを設定して動画クリエイティブを読み込みます。リワード動画広告には、RewardedVideoAdListenerインターフェイスが必要です。このインターフェイスは、サンプルコードに次のメソッドを実装し、各種イベントを処理します。例えば、Activityでは以下のようになります。

private final String TAG = RewardedVideoAdActivity.class.getSimpleName();
private RewardedVideoAd rewardedVideoAd;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    // Instantiate a RewardedVideoAd object. 
    // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
    // now, while you are testing and replace it later when you have signed up.
    // While you are using this temporary code you will only get test ads and if you release
    // your code like this to the Google Play your users will not receive ads (you will get
    // a no fill error).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        @Override
        public void onError(Ad ad, AdError error) {
            // Rewarded video ad failed to load
            Log.e(TAG, "Rewarded video ad failed to load: " + error.getErrorMessage());
        }

        @Override
        public void onAdLoaded(Ad ad) {
            // Rewarded video ad is loaded and ready to be displayed  
            Log.d(TAG, "Rewarded video ad is loaded and ready to be displayed!");
        }

        @Override
        public void onAdClicked(Ad ad) {
            // Rewarded video ad clicked
            Log.d(TAG, "Rewarded video ad clicked!");
        }

        @Override
        public void onLoggingImpression(Ad ad) {
            // Rewarded Video ad impression - the event will fire when the 
            // video starts playing
            Log.d(TAG, "Rewarded video ad impression logged!");
        }

        @Override
        public void onRewardedVideoCompleted() {
            // Rewarded Video View Complete - the video has been played to the end.
            // You can use this event to initialize your reward
            Log.d(TAG, "Rewarded video completed!");

            // Call method to give reward
            // giveReward();
        }

        @Override
        public void onRewardedVideoClosed() {
            // The Rewarded Video ad was closed - this can occur during the video
            // by closing the app, or closing the end card.
            Log.d(TAG, "Rewarded video ad closed!");
        }
    };
    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .build());
    ...
}

ステップ2: リワード動画広告を表示する

シナリオ1: 広告は、読み込みの成功後すぐに表示されます。広告を表示するには、onAdLoaded()メソッドを以下のように変更します。

private RewardedVideoAd rewardedVideoAd;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    // Instantiate a RewardedVideoAd object. 
    // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
    // now, while you are testing and replace it later when you have signed up.
    // While you are using this temporary code you will only get test ads and if you release
    // your code like this to the Google Play your users will not receive ads (you will get
    // a no fill error).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        ...
        @Override
        public void onAdLoaded(Ad ad) {
            // Rewarded video ad is loaded and ready to be displayed  
            rewardedVideoAd.show();
        }
        ...
    };
    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .build());
    ...
}

シナリオ2: 広告の読み込みが成功してから、数秒後または数分後に広告を表示します。広告を表示する前に、その広告が無効になっていないか確認する必要があります。

読み込まれてからすぐに広告が表示されない場合、開発者は広告が無効になっていないか確認する必要があります。正常に読み込まれた後、広告は60分間有効になります。無効な広告を表示している場合は、支払い受けられませんisAdInvalidated()を呼び出して広告を有効にする必要があります。

以下に示す考え方に沿っている必要がありますが、このコードは例に過ぎないので、そのまま自分のプロジェクトにコピーしないでください。

private RewardedVideoAd rewardedVideoAd;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    // Instantiate a RewardedVideoAd object. 
    // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
    // now, while you are testing and replace it later when you have signed up.
    // While you are using this temporary code you will only get test ads and if you release
    // your code like this to the Google Play your users will not receive ads (you will get
    // a no fill error).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        ...
    };
    // load the ad
    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .build());

    // Here is just an example for displaying the ad with delay
    // Please call this method at appropriate timing in your project
    showAdWithDelay();
}

private void showAdWithDelay() {
    /**
     * Here is an example for displaying the ad with delay;
     * Please do not copy the Handler into your project
     */
    // Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        public void run() {
            // Check if rewardedVideoAd has been loaded successfully
            if (rewardedVideoAd == null || !rewardedVideoAd.isAdLoaded()) {
                return;
            }
            // Check if ad is already expired or invalidated, and do not show ad if that is the case. You will not get paid to show an invalidated ad.
            if (rewardedVideoAd.isAdInvalidated()) {
                return;
            }
            rewardedVideoAd.show();
        }
    }, 1000 * 60 * 15); // Show the ad after 15 minutes
}

デフォルトのGoogle Androidエミュレータを使用する場合は、テスト広告の読み込み前に次のコード行を追加します。
AdSettings.addTestDevice("HASHED ID");

指定するIDは、デバイス上で広告を読み込むリクエストを最初に実行したときLogCatに出力される、ハッシュ化されたIDです。

Genymotionと物理的なデバイスではこのステップは必要ありません。実際の広告を使用してテストする場合は、テストガイドをご覧ください。

最後に、ActivityのonDestroyメソッドでdestroyメソッドを使用してオブジェクトをクリーンアップします。メモリリークを避けるため、destroyメソッドを使用して古い広告オブジェクトをクリーンアップしてから新しいインスタンスに割り当てることも必要です。

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

動画広告のハードウェアアクセラレーション

Audience Networkの動画広告では、ハードウェアアクセラレーションを使用したレンダリングを有効にする必要があります。有効にしない場合は、動画の表示中に画面が黒くなることがあります。対象広告:

  • ネイティブ広告の動画広告素材
  • インタースティシャル広告の動画広告素材
  • インストリーム動画広告
  • 動画リワード

ハードウェアアクセラレーションは、ターゲットAPIレベルが14以上(Ice Cream Sandwich, Android 4.0.1)の場合はデフォルトで有効になっていますが、アプリレベルまたはアクティビティレベルで明示的に有効にすることもできます。

アプリレベル

Androidのマニフェストファイルで、次の属性を<application>タグに追加し、アプリ全体でハードウェアアクセラレーションを有効にします。

<application android:hardwareAccelerated="true" ...>

アクティビティレベル

アプリの特定のアクティビティに対してのみこの機能を有効にする場合は、Androidのマニフェストファイルで次の機能を<activity>タグに追加します。以下の例では、インタースティシャル広告とリワード動画のレンダリングに使用されるAudienceNetworkActivityに対してハードウェアアクセラレーションを有効にします。

<activity android:name="com.facebook.ads.AudienceNetworkActivity" android:hardwareAccelerated="true" .../>

サーバー側でのリワード確認

この機能はオプションです。動画リワード広告を利用する際、サーバー側でリワードを確認する必要はありません。これは、自分のサーバーに確認ステップを導入してセキュリティを強化するために、サーバー側でリワードを確認する場合にのみ必要です。この機能を有効にするには、パブリッシャーのエンドポイントをFacebookの担当者にお知らせください。

概要

利用者のリワードをサーバー側で管理する場合に備えて、Facebookでは、検証技術を使用してこれらの処理を安全に実行するためのソリューションを用意しています。Facebookのサーバーが指定のhttpsエンドポイントとやり取りして各広告インプレッションを確認し、リワードを提供するかどうかを確認します。

  1. Audience Network SDKでは、次のパラメーターを使用して動画リワード広告をリクエストします。
    • Facebook Audience Network配置ID
    • 固有ユーザーID - ユニークユーザーを特定するために使用する属性です。例: 数値によるID
    • リワード値 - ユーザーに付与するリワードの値です。たとえば、100コイン
  2. 動画が完了すると、Facebookサーバーはこれらの値を、App Secretと固有の取引IDとともに、指定されたエンドポイントに転送します。
  3. サーバーはリクエストを受け取り次第確認し、次のように応答します。
    • 200 response: リクエストは有効であり、リワードを配信する必要がある
    • Non 200 response: リクエストが有効ではないため、リワードを配信する必要はない
  4. 動画の視聴が完了すると、エンドカードが表示され、次のいずれかのイベントが開始されます。
    • onRewardServerSuccess - ステップ3で200の応答を受け取った場合にのみトリガーされます。
    • onRewardServerFailed - ステップ3で200以外の応答を受け取った場合にトリガーされます。

FacebookのサーバーからパブリッシャーのエンドポイントにアクセスするURLの例: https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

ワークフローは次のようになります。

実装

動画リワードオブジェクトを初期化したあと、広告をロードする前に、ユーザーIDとリワードの内容をリワード広告データに渡す必要があります。ユーザーIDとリワードの内容はどちらも文字列です。例:

private RewardedVideoAd rewardedVideoAd;

private void loadRewardedVideoAd { 
    // Instantiate a RewardedVideoAd object. 
    // NOTE: the placement ID will eventually identify this as your App, you can ignore it for
    // now, while you are testing and replace it later when you have signed up.
    // While you are using this temporary code you will only get test ads and if you release
    // your code like this to the Google Play your users will not receive ads (you will get
    // a no fill error).
    rewardedVideoAd = new RewardedVideoAd(this, "YOUR_PLACEMENT_ID");
    RewardedVideoAdListener rewardedVideoAdListener = new RewardedVideoAdListener() {
        ...
    };

    // Create the rewarded ad data
    RewardData rewardData = new RewardData("YOUR_USER_ID", "YOUR_REWARD");

    rewardedVideoAd.loadAd(
            rewardedVideoAd.buildLoadAdConfig()
                    .withAdListener(rewardedVideoAdListener)
                    .withRewardData(rewardData)
                    .build());
}

リワードが確認されたかどうかをアプリに通知するには、S2SRewardedVideoAdListenerインターフェイスを実装する必要があります。これには、前述のRewardedVideoAdListenerインターフェイスのすべてのイベントと、2つの追加イベントが含まれます。次の関数は上述のイベントとともに使用できます。

@Override
public void onRewardServerSuccess() {
    // Rewarded video ad validated
}

@Override
public void onRewardServerFailed() {
    // Rewarded video ad not validated or no response from server  
}  

サーバー確認のコールバックは、利用者がエンドカードを閉じた後に行われる可能性があります。これらのコールバックのいずれかを受け取るまでは、動画リワードオブジェクトの割り当てを解除しないでください。

次のステップ