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 }
サーバー確認のコールバックは、利用者がエンドカードを閉じた後に行われる可能性があります。これらのコールバックのいずれかを受け取るまでは、動画リワードオブジェクトの割り当てを解除しないでください。
GithubでAudience Network Androidコードサンプルをご確認ください。プロジェクトをIDEにインポートして、機器またはエミュレータで実行します。
アプリを公開して収益を得る準備が整ったら、Audience NetworkのポリシーとFacebookコミュニティ規定を順守していることを確認してから、アプリのレビューを申請します。