Audience Network를 사용하면 Facebook 광고를 통해 Android 앱에서 수익을 창출할 수 있습니다. 보상형 동영상 광고는 전체 화면 형식으로 노출되며, 사용자는 이 동영상 광고를 보는 대가로 온라인 통화, 앱 내 아이템, 독점 콘텐츠 등의 혜택을 받습니다. 광고는 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를 가져오려면 액티비티의 맨 위에 다음 코드를 추가합니다.
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()); ... }
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");
.
기기에 광고를 읽어들이기를 처음 요청할 때는 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 엔드포인트와 통신하여 각 광고 노출 위치를 검증하고 보상을 허락하기에 적절한지 판단합니다.
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 }
참고 - 사용자가 엔드 카드를 닫은 이후에 서버 검증 콜백이 발생할 수 있습니다. 이 콜백 중 하나가 실행될 때까지 보상형 동영상 개체 할당을 취소해서는 안 됩니다.
Github에서 Facebook의 Audience Network Android 코드 샘플을 확인하세요. IDE에 프로젝트를 가져온 다음 기기나 에뮬레이터에서 실행합니다.
앱에 광고를 전송하여 수익을 창출할 준비가 완료되었다면, 앱이 Audience Network 정책 및 Facebook 커뮤니티 규정을 준수하는지 확인한 후 검수를 위해 제출하세요.