在 Android 應用程式中加入獎勵式影片廣告

Audience Network 可讓您利用 Facebook 廣告,將 Android 應用程式變成您的營利來源。獎勵式影片廣告能提供全螢幕體驗,讓用戶自行選擇是否要透過觀看影片來取得獎勵(例如虛擬貨幣、應用程式內物品和隱藏內容等)。此廣告體驗長度為 15-30 秒,用戶不可略過,且內附的結束說明卡設有呼籲字句。整段影片播完後,您會收到回呼以將建議的獎勵頒給用戶。

確保您在開始操作前,已經先行參閱 Audience Network 新手指南Android 新手指南

逐步指示

步驟 1:在活動中初始化獎勵式影片廣告

步驟 2:在活動中顯示獎勵式影片廣告

為 Audience Network SDK 執行初始化

Android Audience Network SDK 5.1 版已加入此方法。

若是 5.3.0 或更高版本,您必須初始化 Android 版 Audience Network SDK如欲了解有關初始化 Android 版 Audience Network SDK 的方法,請參閱此文件

在建立廣告物件及載入廣告前,請為 Audience Network SDK 執行初始化。我們建議您在啟動應用程式時執行此動作。

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

步驟 1:在活動中初始化獎勵式影片廣告

在活動頂部加入下列代碼,以匯入 Facebook 廣告 SDK:

import com.facebook.ads.*;

接著,初始化獎勵式影片物件、設定接聽程式,並載入影片廣告創意。獎勵式影片廣告需要使用 RewardedVideoAdListener 介面,這個介面會在範例程式碼中執行下列方法來處理各種事件。舉例來說,在您的活動中:

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");

首次執行要求以在裝置中載入廣告時,請使用列在 LogCat 的雜湊編號。

若是 Genymotion 與實體裝置,則可跳過這個步驟。如果您想測試實際廣告,請參閱我們的測試指南

最後,使用物件的 destroy 方法,在您活動的 onDestroy 方法中清理該物件。請注意,您也應該先使用 destroy 方法來清理舊廣告物件,再將物件指派給新的執行個體,以免記憶體流失。

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

影片廣告硬件加速

Audience Network 中的影片廣告需要硬件加速顯示才能啟動,否則您的影片畫面可能會出現黑屏。這適用於

  • 原生廣告中的影片廣告創意
  • 插頁廣告中的影片廣告創意
  • 插播影片廣告
  • 獎勵式影片

如果您的 Target API 級別 >=14 (Ice Cream Sandwich, Android 4.0.1),硬件加速就會預設為啟用,但您也可以在應用程式級別或活動級別中啟用此功能。

應用程式級別

在 Android Manifest 檔案中,將下列屬性新增至 <application> 標籤,以啟用整個應用程式的硬件加速:

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

活動級別

如果您只想針對應用程式內的特定活動啟用此功能,請前往 Android Manifest 檔案,將下列功能新增至 <activity> 標籤。下列範例將啟用 AudienceNetworkActivity 的硬件加速功能,以便顯示插頁廣告與獎勵式影片:

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

伺服器端獎勵驗證

此為選用功能!您不需要執行伺服器端獎勵驗證,就能使用獎勵式影片廣告。只有您決定在自有伺服器上引進驗證步驟,以便驗證獎勵來提高安全性時,才需要用到這項功能。請將您的發佈商端點提供給 Facebook 代表,以便啟用這項功能。

概覽

如果您要管理用戶獎勵伺服器端,Facebook 就會採用某種驗證技術來提供安全的實行方案。我們的伺服器會與指定 https 端點進行通訊,以便驗證每次廣告展示,並確認是否應發放獎勵。

  1. Audience Network SDK 會以下列參數要求獲取獎勵式影片廣告:
    • Audience Network 版位編號
    • 專屬用戶編號:您用來識別不重複用戶的屬性,例如數值識別碼
    • 獎勵價值:要發放給用戶的獎勵價值,例如 100 枚代幣
  2. 影片播完後,Facebook 伺服器會將這些值與應用程式密鑰和不重複的交易編號一併傳遞到您指定的端點。
  3. 收到之後,伺服器會驗證該項要求,並作出下列回應:
    • 200 回應:要求有效,應發放獎勵
    • 非 200 回應:要求無效,不應發放獎勵。
  4. 影片播完後,畫面會顯示結束說明卡,系統會觸發下列其中一個事件。
    • onRewardServerSuccess:只有在第 3 步收到 200 回應時才會由系統觸發。
    • onRewardServerFailed:只有在第 3 步收到非 200 回應時才會由系統觸發。

以下範例是一個會從 Facebook 伺服器抵達發佈商端點的網址:https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_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 介面中的上述所有事件,以及兩個額外事件。以下代碼可與上述事件一同使用。

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

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

請注意:伺服器驗證回呼可能會在用戶關閉結束說明卡後發生。您必須等到上述其中一個回呼發生後,才能取消分配獎勵式影片物件。

後續步驟