Native Ad

1. 기본 요건

  • ADX Android SDK를 프로젝트에 추가합니다.

  • Native Ad용으로 발급받은 Ad Unit ID를 사용합니다.

  • 광고를 요청하기 전에 SDK 초기화를 먼저 진행합니다.

    • SDK 초기화는 앱 실행 시 한 번만 호출하여 주시고, 광고 요청은 초기화가 완료된 후에 이뤄져야 합니다.

2. 레이아웃 설정

Native Ad의 경우, 광고에 사용 될 레이아웃을 직접 구성해야 합니다. 필수 구성 요소들은 다음과 같습니다.

  • Title : TextView

  • Main Text : TextView

  • Call-To-Action : Button

  • Icon Image : ImageView

  • Main Image : FrameLayout

  • Privacy Icon : FrameLayout

  • Ad Tag : TextView 또는 ImageView

Ad Tag 요소는 "Ad" 또는 "Advertisement" 문자열을 보여주는 UI 구성 요소를 포함하여, 광고라는 것을 명확하게 사용자에게 인식을 시켜야 합니다. 이 요소가 포함되지 않으면, 일부 광고 네트워크의 광고 송출이 중단될 수 있습니다.

이 요소들은 반드시 포함하여 구성하여 주시고, 광고 컨텐츠를 덮는 Layer가 없어야 합니다. 또한 텍스트 변경, 이미지 변경, 터치 시 액션 변경 등 광고 컨텐츠에 관련된 부분을 가공하거나 변경하지 않도록 주의 부탁드립니다.

샘플 소스의 layout_adx_native_ad.xml을 참조하실 수 있습니다.

3. 구현

Native Ad는 다음 3가지 방법 중 하나로 광고를 로드할 수 있습니다.

Case 1: 하나의 View로 사용하는 경우

MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    AdxNativeAdFactory.init(this);

    // for Native Ad
    AdxNativeAdFactory.setAdxViewBinder("<NATIVE_AD_UNIT_ID>"), 
                            new AdxViewBinder.Builder(R.layout.layout_media_native_ad)
                .mediaViewContainerId(R.id.mediaContainerId)
                .iconImageId(R.id.adIconId)
                .titleId(R.id.titleId)
                .adChoiceContainerId(R.id.adChoicesContainerId)
                .callToActionId(R.id.callToActionId)
                .build());
            
    AdxNativeAdFactory.preloadAd("<NATIVE_AD_UNIT_ID>");
}

Activity (or Fragment)

private View mAdView;
private com.adxcorp.ads.nativeads.NativeAd mNativeAd;
    
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_native_ad_factory);
    
    AdxNativeAdFactory.addListener(mListener);
    AdxNativeAdFactory.loadAd("<NATIVE_AD_UNIT_ID>");
}
    
@Override
protected void onDestroy() {
    AdxNativeAdFactory.removeListener(mListener);
    
    if(mNativeAd != null) {
        mNativeAd.destroy();
        mNativeAd = null;
    }
    
    super.onDestroy();
}

private final AdxNativeAdFactory.NativeAdListener mListener = new AdxNativeAdFactory.NativeAdListener() {
    @Override
    public void onSuccess(String s, com.adxcorp.ads.nativeads.NativeAd nativeAd) {
        
        if ("<NATIVE_AD_UNIT_ID>".equals(s)) {
            mNativeAd = nativeAd;
            mAdView = AdxNativeAdFactory.getNativeAdView(
                    NativeAdFactoryActivity.this,
                    s,
                    mContentView,
                    new com.adxcorp.ads.nativeads.NativeAd.NativeEventListener() {
                        @Override
                        public void onImpression(View view) {
                        }

                        @Override
                        public void onClick(View view) {
                        }
                    });
            mContentView.addView(mAdView);
        }
    }

    @Override
    public void onFailure(String s) {
    }
};

Case 2: RecyclerView를 사용하는 경우

MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    AdxNativeAdFactory.init(this);

    // for Native Ad
    AdxNativeAdFactory.setAdxViewBinder("<NATIVE_AD_UNIT_ID>"), 
                            new AdxViewBinder.Builder(R.layout.layout_media_native_ad)
                .mediaViewContainerId(R.id.mediaContainerId)
                .iconImageId(R.id.adIconId)
                .titleId(R.id.titleId)
                .adChoiceContainerId(R.id.adChoicesContainerId)
                .callToActionId(R.id.callToActionId)
                .build());
}

Acivity (or Fragment)

리스트에서 광고 고정 위치와 반복 위치를 소스 코드에 직접 지정해야 합니다.

private AdxRecyclerAdapter mRecyclerAdapter;
private RecyclerView mRecyclerView;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_native_ad_recyclerview);

    mRecyclerView = (RecyclerView) findViewById(R.id.native_recycler_view);

    final RecyclerView.Adapter originalAdapter = new DemoRecyclerAdapter();

    // 광고 고정 및 반복 위치 지정  
    NativeAdPosition.ClientPosition clientPosition = new NativeAdPosition.ClientPosition();
    clientPosition.addFixedPosition(2);
    clientPosition.enableRepeatingPositions(5);

    mRecyclerAdapter = AdxNativeAdFactory.getAdxRecyclerAdapter(this, originalAdapter, "<Insert_ADX_AdUnitId>", clientPosition);

    mRecyclerView.setAdapter(mRecyclerAdapter);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerAdapter.loadAds("<NATIVE_AD_UNIT_ID>");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mRecyclerAdapter.destroy();
}

Case 3: Closed Native Ad 사용 시

담당 매니저와 협의 후, Close Native Ad 용으로 발급 된 AdUnit ID를 사용하여 아래와 같이 구현합니다.

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_app_wall);

    AdxCloseAdFactory.init(this, "<NATIVE_AD_UNIT_ID>", "Exit Message");
    AdxCloseAdFactory.preloadAd();
}

@Override
public void onBackPressed() {
    AdxCloseAdFactory.showCloseAd(this, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            finish();
        }
    }, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
        }
    });
}

@Override
protected void onDestroy() {
    AdxCloseAdFactory.destroy();

    super.onDestroy();
}

4. Ad Revenue (OnPaidEvent)

  • 광고 노출이 발생동안 예상되는 광고 수익을 받아볼 수 있습니다.

  • 이는 미디에이션 설정 과정에서 수동적으로 설정한 값과 정확한 값이 섞여 있어서 예상 값으로 사용하시는 것을 권장드립니다.

  • ecpm의 currency는 USD입니다.

  • 아래와 같이 OnPaidEvent 콜백을 등록하여 사용하시면 됩니다.

  • AdJust의 광고 매출 데이터 연동을 지원합니다. 상세한 내용은 AdJust의 AD(X) SDK 연동 가이드를 확인 부탁드립니다.

  • 이가능은 SDK 버전 2.6.0 이상에서 Case 1: 하나의 View로 사용하는 경우에만 지원됩니다.

private final AdxNativeAdFactory.NativeAdListener mListener = new AdxNativeAdFactory.NativeAdListener() {
    @Override
    public void onSuccess(String s, com.adxcorp.ads.nativeads.NativeAd nativeAd) {

        if (mAdxUnitId.equals(s)) {
            mNativeAd = nativeAd;
            mNativeAd.setOnPaidEventListener(new OnPaidEventListener() {
                @Override
                public void onPaidEvent(double ecpm) {
                    /* Firebase Analytics 샘플
                    double revenue = ecpm / 1000;
                    
                    mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
                    Bundle params = new Bundle();
                    params.putString(FirebaseAnalytics.Param.AD_PLATFORM, "AD(X)");
                    params.putString(FirebaseAnalytics.Param.AD_FORMAT, "NativeAd");
                    params.putString(FirebaseAnalytics.Param.AD_UNIT_NAME, "ADX Native Ad");
                    params.putDouble(FirebaseAnalytics.Param.VALUE, revenue);
                    params.putString(FirebaseAnalytics.Param.CURRENCY, "USD");
                    mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION, params);
                    */
                    
                    /* AppsFlyer 샘플
                    double revenue = ecpm / 1000;
                    
                    Map<String, String> customParams = new HashMap<>();
                    customParams.put(Scheme.AD_TYPE, "NativeAd");
                    customParams.put("ad_unit_name", "ADX Native Ad");
                    
                    AppsFlyerAdRevenue.logAdRevenue(
                          "AD(X)",
                          MediationNetwork.customMediation,
                          Currency.getInstance(Locale.US),
                          revenue,
                          customParams
                    );
                    */
                }
            });
        }
    }

    @Override
    public void onFailure(String s) {
    }
};

Last updated