Native Ad
1. 基本要求
ADX Android SDK添加到项目中。
请使用为 Native Ad 签发的 Ad Unit ID。
在请求广告之前先对SDK进行初始化。
SDK 初始化请在应用运行时只调用一次,并且 广告请求必须在初始化完成后进行。
2. 布局设置
对于 Native Ad,需要您自行构建将用于展示广告的布局。必需的组成元素如下。
Title :
TextViewMain Text :
TextViewCall-To-Action :
ButtonIcon Image :
ImageViewMain Image :
FrameLayoutPrivacy Icon :
FrameLayoutAd Tag :
TextView 或 ImageView
请务必包含这些元素并进行配置,且广告内容上方不得有覆盖层。此外请注意不要对与广告内容相关的部分进行加工或更改,例如更改文本、替换图片、修改触摸时的动作等。
可参考示例源码中的 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>");
}override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_native_ad_factory)
AdxNativeAdFactory.init(this)
AdxNativeAdFactory.setAdxViewBinder("<NATIVE_AD_UNIT_ID>",
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) {
}
};private var mAdView: View? = null
private var mNativeAd: NativeAd? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_native_ad_factory)
AdxNativeAdFactory.addListener(mListener)
AdxNativeAdFactory.loadAd("<NATIVE_AD_UNIT_ID>")
}
override fun onDestroy() {
super.onDestroy()
AdxNativeAdFactory.removeListener(mListener)
mNativeAd?.destroy()
mNativeAd = null
}
private val mListener: AdxNativeAdFactory.NativeAdListener = object : AdxNativeAdFactory.NativeAdListener {
override fun onSuccess(s: String, nativeAd: NativeAd) {
if ("<NATIVE_AD_UNIT_ID>" == s) {
mNativeAd = nativeAd
mAdView = AdxNativeAdFactory.getNativeAdView(
this@NativeAdFactoryActivity,
s,
mContentView,
object : NativeAd.NativeEventListener {
override fun onImpression(view: View) {
}
override fun onClick(view: View) {
}
})
mContentView?.addView(mAdView)
}
}
override fun onFailure(s: String) {
}
}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());
}override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_native_ad_factory)
AdxNativeAdFactory.init(this)
AdxNativeAdFactory.setAdxViewBinder("<NATIVE_AD_UNIT_ID>",
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();
}private var mRecyclerAdapter: AdxRecyclerAdapter? = null
private var mRecyclerView: RecyclerView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_native_ad_recyclerview)
mRecyclerView = findViewById<View>(R.id.native_recycler_view) as RecyclerView
val originalAdapter: RecyclerView.Adapter<*> = DemoRecyclerAdapter()
// 指定广告固定及重复位置
val clientPosition = NativeAdPosition.ClientPosition()
clientPosition.addFixedPosition(2)
clientPosition.enableRepeatingPositions(5)
mRecyclerAdapter = AdxNativeAdFactory.getAdxRecyclerAdapter(this, originalAdapter, "<Insert_ADX_AdUnitId>", clientPosition)
mRecyclerView?.adapter = mRecyclerAdapter
mRecyclerView?.layoutManager = LinearLayoutManager(this)
mRecyclerAdapter?.loadAds("<Insert_ADX_AdUnitId>")
}
override fun 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();
}override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AdxCloseAdFactory.init(this, "<NATIVE_AD_UNIT_ID>", "Exit Message")
AdxCloseAdFactory.preloadAd()
}
override fun onBackPressed() {
AdxCloseAdFactory.showCloseAd(this, { _, _ ->
finish()
}) {}
}
override fun onDestroy() {
AdxCloseAdFactory.destroy()
super.onDestroy()
}4. Ad Revenue (OnPaidEvent)
您可以收到广告展示期间预期的广告收益。
由于该值可能混合了在中介设置过程中手动设置的值,建议作为预估值使用。
ecpm 的货币为 USD。
如下
OnPaidEvent注册回调后使用即可。可以将广告收入数据与 MMP 对接。详细信息请参阅下面的 SDK 对接指南。
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) {
}
};private val mListener: AdxNativeAdFactory.NativeAdListener = object : AdxNativeAdFactory.NativeAdListener {
override fun onSuccess(s: String, nativeAd: NativeAd) {
mNativeAd = nativeAd
mNativeAd.setOnPaidEventListener(object : OnPaidEventListener() {
fun onPaidEvent(ecpm: Double) {
val revenue: Double = ecpm / 1000
// Firebase Analytics 示例
firebaseAnalytics = Firebase.analytics
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION) {
param(FirebaseAnalytics.Param.AD_PLATFORM, "AD(X)")
param(FirebaseAnalytics.Param.AD_UNIT_NAME, "ADX Native Ad")
param(FirebaseAnalytics.Param.AD_FORMAT, "NativeAd")
param(FirebaseAnalytics.Param.VALUE, revenue)
param(FirebaseAnalytics.Param.CURRENCY, "USD")
}
// AppsFlyer 示例
val customParams: MutableMap<String, String> = HashMap()
customParams[Scheme.AD_TYPE] = "NativeAd"
customParams["ad_unit_name"] = "ADX Native Ad"
AppsFlyerAdRevenue.logAdRevenue(
"AD(X)",
MediationNetwork.customMediation,
Currency.getInstance(Locale.US),
revenue,
customParams
)
}
})
}
override fun onFailure(s: String) {
}
}最后更新于
这有帮助吗?