Audience Networkを利用すると、Android用アプリにFacebook広告を掲載して収益を生み出すことができます。動画リワード広告は、利用者が動画広告を視聴することの引き換えに、仮想通貨、アプリ内アイテム、限定コンテンツといった何らかの特典を得られる、フルスクリーンの広告サービスです。広告の長さは15~30秒で、スキップはできず、コールトゥアクションが備わったエンドカードが表示されます。動画の視聴が完了すると、利用者におすすめのリワードを付与するためのコールバックが届きます。
続行する前に、必ずAudience NetworkのスタートガイドとAndroidのスタートガイドすべてに目を通しておいてください。
このメソッドは、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);
}
...
}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());
...
}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());
...
}読み込まれてからすぐに広告が表示されない場合、開発者は広告が無効になっていないか確認する必要があります。正常に読み込まれた後、広告は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エンドポイントとやり取りして各広告インプレッションを確認し、リワードを提供するかどうかを確認します。
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
} サーバー確認のコールバックは、利用者がエンドカードを閉じた後に行われる可能性があります。これらのコールバックのいずれかを受け取るまでは、動画リワードオブジェクトの割り当てを解除しないでください。
関連するコードサンプルは、SwiftとObjective-Cの両方ともGitHubサンプルアプリリポジトリから入手可能です
アプリで広告の統合をテストします。
アプリまたはウェブサイトから広告のリクエストが申請されるとすぐに、広告がAudience NetworkポリシーとFacebookコミュニティ規定に準拠していることを確認するためのレビューが行われます。