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" 或 "Advertisement" 字样的 UI 组件,以明确向用户表明这是广告。如果不包含此元素,某些广告网络可能会停止投放广告。

请务必包含这些元素并进行配置,且广告内容上方不得有覆盖层。此外请注意不要对与广告内容相关的部分进行加工或更改,例如更改文本、替换图片、修改触摸时的动作等。

可参考示例源码中的 layout_adx_native_ad.xml文件。

3. 实现

Native Ad 可以通过以下三种方式之一来加载广告。

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)

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) {
                    double revenue = ecpm / 1000;
                    
                    // Firebase Analytics 示例
                    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 示例
                    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) {
    }
};

最后更新于

这有帮助吗?