Thêm quảng cáo video kèm phần thưởng vào ứng dụng Android

Với Audience Network, bạn có thể kiếm tiền từ ứng dụng Android của mình bằng quảng cáo trên Facebook. Quảng cáo video kèm phần thưởng là trải nghiệm toàn màn hình, trong đó người dùng chọn xem quảng cáo video để đổi lấy thứ gì đó có giá trị, chẳng hạn như tiền ảo, vật phẩm trong ứng dụng, nội dung độc quyền, v.v. Trải nghiệm quảng cáo gồm 15 đến 30 giây quảng cáo không thể bỏ qua và một thẻ cuối có nút kêu gọi hành động. Sau khi người dùng xem xong toàn bộ video, bạn sẽ nhận được hàm gọi lại yêu cầu trao phần thưởng đã đề xuất cho người dùng.

Đảm bảo bạn đã hoàn tất hướng dẫn Bắt đầuBắt đầu dành cho Android với Audience Network trước khi tiếp tục.

Hướng dẫn từng bước

Bước 1: Khởi tạo quảng cáo video kèm phần thưởng trong Hoạt động của bạn

Bước 2: Hiển thị quảng cáo video kèm phần thưởng trong Hoạt động của bạn

Khởi tạo Audience Network SDK

Phương thức này được thêm vào Audience Network Android SDK phiên bản 5.1.

Khởi tạo công khai Audience Network Android SDK là yêu cầu bắt buộc đối với phiên bản 5.3.0 trở lên. Vui lòng tham khảo tài liệu này về cách khởi tạo Audience Network Android SDK.

Trước khi tạo đối tượng quảng cáo và tải quảng cáo, bạn cần khởi tạo Audience Network SDK. Bạn nên thực hiện việc này khi khởi chạy ứng dụng.

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

Bước 1: Khởi tạo quảng cáo video kèm phần thưởng trong Hoạt động của bạn

Thêm mã sau vào đầu Hoạt động để nhập SDK quảng cáo trên Facebook:

import com.facebook.ads.*;

Sau đó, khởi tạo đối tượng video kèm phần thưởng, đặt trình nghe và tải nội dung video. Quảng cáo video kèm phần thưởng yêu cầu giao diện RewardedVideoAdListener triển khai các phương thức sau trong mã mẫu để xử lý các sự kiện khác nhau. Ví dụ như trong hoạt động của bạn:

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());
    ...
}

Bước 2: Hiển thị quảng cáo video kèm phần thưởng

Tình huống 1: Hiển thị ngay quảng cáo sau khi tải thành công. Sửa đổi phương thức onAdLoaded() ở trên để hiển thị như sau:

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());
    ...
}

Tình huống 2: Hiển thị quảng cáo trong vài giây hoặc vài phút sau khi tải thành công. Bạn nên kiểm tra xem quảng cáo có bị vô hiệu hóa hay không trước khi hiển thị quảng cáo đó.

Trong trường hợp không hiển thị quảng cáo ngay sau khi tải quảng cáo, nhà quảng cáo sẽ chịu trách nhiệm kiểm tra xem quảng cáo có bị vô hiệu hóa hay không. Sau khi tải thành công, quảng cáo sẽ có hiệu lực trong 60 phút. Bạn sẽ không được thanh toán nếu hiển thị một quảng cáo không hợp lệ. Bạn nên gọi isAdInvalidated() để xác thực quảng cáo đó.

Bạn nên làm theo ý tưởng bên dưới, tuy nhiên, vui lòng không sao chép mã vào dự án của bạn vì đây chỉ là mã ví dụ:

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
}

Nếu đang sử dụng trình mô phỏng Google Android mặc định, thì bạn cần thêm dòng mã sau trước khi tải quảng cáo thử nghiệm:
AdSettings.addTestDevice("HASHED ID");.

Sử dụng ID đã mã hóa được in vào logcat khi bạn yêu cầu tải quảng cáo trên thiết bị lần đầu.

Các thiết bị Genymotion và thiết bị vật lý không cần bước này. Nếu bạn muốn thử nghiệm với quảng cáo thực, vui lòng tham khảo Hướng dẫn thử nghiệm của chúng tôi.

Cuối cùng, hãy xóa bỏ đối tượng bằng phương thức destroy của đối tượng đó trong phương thức onDestroy của hoạt động. Lưu ý rằng bạn cũng nên dùng phương thức destroy để xóa bỏ các đối tượng quảng cáo cũ trước khi chỉ định cho một phiên bản mới nhằm tránh rò rỉ bộ nhớ.

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

Tăng tốc phần cứng cho quảng cáo video

Quảng cáo video trong Audience Network yêu cầu phải bật hiển thị được tăng tốc phần cứng, nếu không, bạn có thể gặp phải màn hình đen trong khi xem video. Điều này áp dụng với

  • Nội dung video trong quảng cáo tự nhiên
  • Nội dung video trong quảng cáo chèn giữa
  • Quảng cáo video trực tuyến
  • Video kèm phần thưởng

Tăng tốc phần cứng sẽ được bật theo mặc định nếu cấp API mục tiêu của bạn >=14 (Ice Cream Sandwich, Android 4.0.1), nhưng bạn cũng có thể bật tính năng này ở cấp ứng dụng hoặc cấp hoạt động.

Cấp độ ứng dụng

Trong tệp kê khai Android của bạn, hãy thêm thuộc tính sau vào thẻ <application> để bật tính năng tăng tốc phần cứng cho toàn bộ ứng dụng:

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

Cấp độ hoạt động

Nếu bạn chỉ muốn bật tính năng này cho các hoạt động cụ thể trong ứng dụng, thì trong tệp kê khai Android của mình, bạn có thể thêm tính năng sau vào thẻ <activity>. Trong ví dụ sau, chúng tôi sẽ bật tính năng tăng tốc phần cứng cho AudienceNetworkActivity dùng để hiển thị quảng cáo chèn giữa và video kèm phần thưởng:

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

Xác thực phần thưởng phía máy chủ

Đây là tùy chọn! Bạn không phải thực hiện xác thực phần thưởng phía máy chủ để sử dụng quảng cáo video kèm phần thưởng. Bạn chỉ phải làm điều này nếu quyết định xác thực phần thưởng trên máy chủ của chính mình để cải thiện khả năng bảo mật bằng cách bổ sung bước xác thực vào máy chủ này. Vui lòng cung cấp điểm cuối của nhà phát hành cho đại diện Facebook của bạn để bật tính năng này.

Tổng quan

Nếu bạn quản lý phần thưởng cho người dùng ở phía máy chủ, thì Facebook sẽ cung cấp giải pháp thực hiện điều này một cách bảo mật bằng cách sử dụng kỹ thuật xác thực. Máy chủ của chúng tôi sẽ giao tiếp với điểm cuối https đã chỉ định để xác thực từng lượt hiển thị quảng cáo và xác thực liệu có trao phần thưởng hay không.

  1. Audience Network SDK yêu cầu quảng cáo video kèm phần thưởng phải có các thông số sau:
    • ID vị trí quảng cáo trên Audience Network
    • ID số người dùng - thuộc tính mà bạn sử dụng để xác định số người dùng. Ví dụ: số nhận dạng
    • Giá trị phần thưởng - giá trị của phần thưởng mà bạn muốn trao cho người dùng. Ví dụ: 100 xu
  2. Sau khi người dùng xem hết video, Máy chủ Facebook sẽ chuyển tiếp các giá trị này tới điểm cuối đã chỉ định, cùng với Khóa bí mật của ứng dụng và ID giao dịch duy nhất.
  3. Sau khi nhận, máy chủ sẽ xác thực yêu cầu và phản hồi như sau:
    • Phản hồi 200: yêu cầu hợp lệ và phần thưởng sẽ được trao
    • Phản hồi không phải phản hồi 200: yêu cầu không hợp lệ và phần thưởng sẽ không được trao.
  4. Sau khi video phát xong, thẻ cuối sẽ hiển thị và một trong những sự kiện sau sẽ được kích hoạt.
    • onRewardServerSuccess - chỉ được kích hoạt nếu nhận được phản hồi 200 trong bước 3.
    • onRewardServerFailed - được kích hoạt nếu nhận được phản hồi không phải là 200 trong bước 3.

Ví dụ về URL sẽ được gửi từ máy chủ của Facebook đến điểm cuối của nhà phát hành: https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

Quy trình sẽ có dạng như sau:

Triển khai

Sau khi khởi tạo đối tượng video kèm phần thưởng, bạn cần chuyển ID người dùng và Giá trị phần thưởng vào dữ liệu quảng cáo kèm phần thưởng trước khi tải quảng cáo. Cả ID người dùng và Giá trị phần thưởng đều ở dạng chuỗi. Ví dụ:

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());
}

Để ứng dụng của bạn nhận được thông báo liệu phần thưởng đã được xác thực hay chưa, bạn sẽ cần triển khai giao diện S2SRewardedVideoAdListener. Điều này bao gồm tất cả các sự kiện nêu ở trên trong giao diện RewardedVideoAdListener, cũng như hai sự kiện khác. Bạn có thể sử dụng thông tin sau cùng với các sự kiện đề cập ở trên.

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

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

Lưu ý rằng lệnh gọi lại xác thực máy chủ có thể diễn ra sau khi người dùng loại bỏ thẻ cuối. Bạn không nên giải phóng đối tượng video kèm phần thưởng cho đến khi một trong các hàm gọi lại này xuất hiện.

Các bước tiếp theo