Android 앱에 보상형 동영상 광고 추가

Audience Network를 사용하면 Facebook 광고를 통해 Android 앱에서 수익을 창출할 수 있습니다. 보상형 동영상 광고는 전체 화면 형식으로 노출되며, 사용자는 이 동영상 광고를 보는 대가로 온라인 통화, 앱 내 아이템, 독점 콘텐츠 등의 혜택을 받습니다. 광고는 15~30초 길이로 건너뛸 수 없으며, 엔드 카드에 행동 유도 버튼이 포함됩니다. 사용자가 동영상을 모두 조회하면 여러분은 약속된 보상을 지급하라는 콜백을 받게 됩니다.

계속하기 전에 Audience Network 시작하기Android 시작하기 가이드를 완료했는지 확인하세요.

단계별 안내

1단계: 액티비티에서 보상형 동영상 광고 초기화

2단계: 액티비티에 보상형 동영상 광고 게재

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단계: 액티비티에서 보상형 동영상 광고 초기화

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에 인쇄되어 있는 해시 처리된 ID를 사용하세요.

Genymotion 및 실제 기기에서는 이 단계가 필요하지 않습니다. 실제 광고를 사용하여 테스트하려면 테스트 가이드를 참조하세요.

마지막으로 액티비티의 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는 다음과 같은 매개변수를 사용하여 보상형 동영상 광고를 요청합니다.
    • Audience Network 노출 위치 ID
    • 고유 사용자 ID - 고유한 사용자를 식별하는 데 사용되는 속성입니다. 예: 숫자로 된 식별자
    • 보상 값 - 사용자에게 제공할 보상의 값입니다. 예: 100코인
  2. 동영상 조회가 완료되면 Facebook 서버에서 앱 시크릿 코드 및 고유 거래 ID와 함께 해당 값을 지정된 엔드포인트에 전달합니다.
  3. 수신 후 서버에서는 요청을 검증하고 다음과 같은 응답을 반환합니다.
    • 200 response: 요청이 유효하므로 보상을 제공해야 합니다.
    • 200 response 외 응답: 요청이 유효하지 않으므로 보상을 제공해서는 안 됩니다.
  4. 동영상 조회가 완료되면 엔드 카드가 표시되며 다음 이벤트 중 하나가 발생합니다.
    • onRewardServerSuccess - 3단계에서 200 response가 수신된 경우에만 트리거됩니다.
    • onRewardServerFailed - 3단계에서 200 response 외 응답이 수신된 경우에 트리거됩니다.

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 인터페이스에 명시된 모든 이벤트와 두 개의 추가 이벤트가 포함됩니다. 위에서 언급한 이벤트와 함께 다음 이벤트를 사용할 수 있습니다.

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

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

참고 - 사용자가 엔드 카드를 닫은 이후에 서버 검증 콜백이 발생할 수 있습니다. 이 콜백 중 하나가 실행될 때까지 보상형 동영상 개체 할당을 취소해서는 안 됩니다.

다음 단계