信息流广告
信息流广告
此章节将演示如何请求在原生
环境下请求与展示信息流广告
竖版图文 | 横板图文 |
---|---|
![]() | ![]() |
请求信息流广告
调用ZJNativeExpressAd#loadAd
的重载方法请求广告,并在ZJNativeExpressAdLoadListener
中获取广告对象与处理错误信息
public class ZJNativeExpressAd {
public static void loadAd(Activity activity, String posId, int num, ZJNativeExpressAdLoadListener loadListener);
public static void loadAd(Activity activity, String posId, int num, boolean isVolumeOn, ZJNativeExpressAdLoadListener loadListener);
public static void loadAd(Activity activity, String posId, int num, int widthDP, int heightDP, ZJNativeExpressAdLoadListener loadListener);
/**
* 加载广告
*
* @param activity 当前Activity
* @param posId 广告位ID
* @param num 期望请求的数量
* @param widthDP 期望宽,单位DP,部分联盟需要额外配置
* @param heightDP 期望高,单位DP,部分联盟需要额外配置
* @param isVolumeOn 是否开启声音(默认为true)
* @param loadListener 加载回调
*/
public static void loadAd(Activity activity, String posId, int num, int widthDP, int heightDP, boolean isVolumeOn, ZJNativeExpressAdLoadListener loadListener);
}
提示
默认不需要传入宽高数值,SDK 会根据模板自适应渲染
如有特殊需求传入时,请联系我们固定素材的宽高比,并需要确保传入的数值单位为DP
。且为有效值(不大于屏幕宽高),否则会渲染失败。
加载回调说明
方法 | 说明 |
---|---|
onError(int code, String msg) | 广告加载出错 code: 错误码 msg: 错误信息 |
onAdLoaded(List<ZJNativeExpressAd> adList) | 广告加载成功 adList: 广告列表 |
提示
Demo 工程中提供了简易的广告缓存策略示例,建议请求信息流列表时使用缓存,减少无效请求,提升广告的曝光率
展示信息流广告
在加载成功回调中获取到ZJNativeExpressAd
对象后,可以配置交互回调,并展示广告
展示广告分为render
方法手动渲染广告和showAd
方法 SDK 渲染广告两种,其中
render(Activity)
方法需要在onNativeExpressAdRenderSuccess
回调中获取到adView
,然后手动插入到容器中showAd(Activity, ViewGroup)
方法需要传入容器对象,SDK 会自动渲染并将adView
插入到容器中,不会有onNativeExpressAdRenderSuccess
回调
ZJNativeExpressAd 说明
方法 | 说明 |
---|---|
setInteractionListener(ZJNativeExpressAdInteractionListener interactionListener) | 配置交互回调 |
showAd(Activity activity, ViewGroup container) | SDK展示广告 activity: 需要传入当前前台activity对象 container: 设置广告容器 |
showAd(Activity activity, ViewGroup container, ViewGroup.LayoutParams lp) | SDK展示广告 activity: 需要传入当前前台activity对象 container: 设置广告容器 lp: 广告视图在容器内的LayoutParams |
render(Activity activity) | 手动渲染广告 调用后在 onNativeExpressAdRenderSuccess 回调中会返回 adView |
destroy() | 页面销毁时需要调用,回收资源,防止内存泄漏 |
交互回调说明
方法 | 说明 |
---|---|
onNativeExpressAdRenderSuccess(View adView) | 广告渲染成功 adView: 广告视图,需要手动添加到容器中,仅调用 render(Activity) 方法时回调 |
onNativeExpressAdShow() | 广告展示 |
onNativeExpressAdClick() | 广告点击 |
onNativeExpressAdClose() | 广告关闭 |
onNativeExpressAdShowError(int code, String msg) | 广告展示失败 code: 错误码 msg: 错误信息 |
信息流广告接入示例
单条信息流接入示例
// 加载广告
ZJNativeExpressAd.loadAd(this, posId, 1, new ZJNativeExpressAdLoadListener() {
@Override
public void onError(int code, @NonNull String msg) {
Log.e("ZJNativeExpressAd", "信息流加载出错" + code + "-" + msg);
}
@Override
public void onAdLoaded(@NonNull List<ZJNativeExpressAd> adList) {
// 信息流广告加载成功,配置交互回调
adList.get(0).setInteractionListener(NativeExpressActivity.this);
// SDK 渲染
adList.get(0).showAd(MainActivity.this, this.container);
}
});
// 加载广告
ZJNativeExpressAd.loadAd(this, posId, 1, object : ZJNativeExpressAdLoadListener {
override fun onError(code: Int, msg: String) {
Log.e("ZJNativeExpressAd", "信息流加载出错$code-$msg")
}
override fun onAdLoaded(adList: List<ZJNativeExpressAd>) {
// 信息流广告加载成功,配置交互回调
adList[0].setInteractionListener(this@NativeExpressActivity)
// SDK 渲染
adList[0].showAd(this@MainActivity, this.container)
}
})
插入到列表中
请求广告
private void loadMore() {
int widthDP = 0;
if (recycler.getWidth() > 0) {
widthDP = UIUtil.getViewWidthDP(recycler);
// Linear / Grid
widthDP = isLinearLayout ? widthDP : widthDP / 2;
}
ZJNativeExpressAd.loadAd(this, DataCenter.PosId.NATIVE_EXPRESS, 3, widthDP, 0, new ZJNativeExpressAdLoadListener() {
/**
* 加载出错
*
* @param code 错误码
* @param msg 错误信息
*/
@Override
public void onError(int code, @NonNull String msg) {
if (recycler != null) {
recycler.setLoadingError();
}
Toast.makeText(NativeExpressListActivity.this, "广告数据请求失败: " + code + "-" + msg, Toast.LENGTH_SHORT).show();
}
/**
* 加载成功
*
* @param adList 广告列表
*/
@Override
public void onAdLoaded(@NonNull List<ZJNativeExpressAd> adList) {
if (recycler == null) {
// 当前的页面已经被销毁,后续不需要再进行其他操作
return;
}
recycler.setLoadingFinish();
if (adList.isEmpty()) {
Toast.makeText(NativeExpressListActivity.this, "加载失败", Toast.LENGTH_SHORT).show();
return;
}
List<ZJNativeExpressAd> newData = new ArrayList<>();
int loadCount = 15; // 模拟正常数据
for (int i = 0; i < loadCount; i++) {
newData.add(null);
}
for (ZJNativeExpressAd ad : adList) {
if (ad == null) {
continue;
}
// 插入到数据中
newData.add(new Random().nextInt(newData.size() - 1), ad);
}
boolean isStop = adapter.addData(newData);
if (isStop) {
recycler.onStop();
}
}
});
}
private fun loadMore() {
var widthDP = 0
if (recycler.getWidth() > 0) {
widthDP = UIUtil.getViewWidthDP(recycler)
// Linear / Grid
widthDP = if (isLinearLayout) widthDP else widthDP / 2
}
ZJNativeExpressAd.loadAd(
this,
DataCenter.PosId.NATIVE_EXPRESS,
3,
widthDP,
0,
object : ZJNativeExpressAdLoadListener {
/**
* 加载出错
*
* @param code 错误码
* @param msg 错误信息
*/
override fun onError(code: Int, msg: String) {
if (recycler != null) {
recycler.setLoadingError()
}
Toast.makeText(
this@NativeExpressListActivity,
"广告数据请求失败: $code-$msg", Toast.LENGTH_SHORT
).show()
}
/**
* 加载成功
*
* @param adList 广告列表
*/
override fun onAdLoaded(adList: List<ZJNativeExpressAd?>) {
if (recycler == null) {
// 当前的页面已经被销毁,后续不需要再进行其他操作
return
}
recycler.setLoadingFinish()
if (adList.isEmpty()) {
Toast.makeText(
this@NativeExpressListActivity,
"加载失败",
Toast.LENGTH_SHORT
).show()
return
}
val newData: MutableList<ZJNativeExpressAd?> = ArrayList()
val loadCount = 15 // 模拟正常数据
for (i in 0 until loadCount) {
newData.add(null)
}
for (ad in adList) {
if (ad == null) {
continue
}
// 插入到数据中
newData.add(Random().nextInt(newData.size - 1), ad)
}
val isStop: Boolean = adapter.addData(newData)
if (isStop) {
recycler.onStop()
}
}
})
}
在列表中渲染广告
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof AdViewHolder) {
((AdViewHolder) holder).container.removeAllViews();
ZJNativeExpressAd ad = adList.get(position);
// 配置回调
ad.setInteractionListener(new ZJNativeExpressAdInteractionListener() {
/**
* 展示失败
*
* @param code 错误码
* @param msg 错误信息
*/
@Override
public void onNativeExpressAdShowError(int code, String msg) {
Toast.makeText(activity, "展示出错: " + code + "-" + msg, Toast.LENGTH_SHORT).show();
}
/**
* 渲染成功
* 仅在调用render方法后回调,调用showAd方法时不会回调渲染成功
* @param adView 广告的View,需要手动添加到容器中
*/
@Override
public void onNativeExpressAdRenderSuccess(View adView) {
Toast.makeText(activity, "渲染成功", Toast.LENGTH_SHORT).show();
if (adView != null) {
((AdViewHolder) holder).container.addView(adView);
}
}
/**
* 展示成功
*/
@Override
public void onNativeExpressAdShow() {
Toast.makeText(activity, "广告展示", Toast.LENGTH_SHORT).show();
}
/**
* 点击
*/
@Override
public void onNativeExpressAdClick() {
Toast.makeText(activity, "广告点击", Toast.LENGTH_SHORT).show();
}
/**
* 关闭,部分广告不支持
*/
@Override
public void onNativeExpressAdClose() {
Toast.makeText(activity, "广告关闭", Toast.LENGTH_SHORT).show();
int pos = holder.getPosition();
adList.remove(pos);
notifyItemRemoved(pos);
}
});
// 手动渲染广告
ad.render(activity);
}
}
fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is AdViewHolder) {
(holder as AdViewHolder).container.removeAllViews()
val ad: ZJNativeExpressAd = adList.get(position)
// 配置回调
ad.setInteractionListener(object : ZJNativeExpressAdInteractionListener {
/**
* 展示失败
*
* @param code 错误码
* @param msg 错误信息
*/
override fun onNativeExpressAdShowError(code: Int, msg: String) {
Toast.makeText(activity, "展示出错: $code-$msg", Toast.LENGTH_SHORT).show()
}
/**
* 渲染成功
* 仅在调用render方法后回调,调用showAd方法时不会回调渲染成功
* @param adView 广告的View,需要手动添加到容器中
*/
override fun onNativeExpressAdRenderSuccess(adView: View) {
Toast.makeText(activity, "渲染成功", Toast.LENGTH_SHORT).show()
if (adView != null) {
(holder as AdViewHolder).container.addView(adView)
}
}
/**
* 展示成功
*/
override fun onNativeExpressAdShow() {
Toast.makeText(activity, "广告展示", Toast.LENGTH_SHORT).show()
}
/**
* 点击
*/
override fun onNativeExpressAdClick() {
Toast.makeText(activity, "广告点击", Toast.LENGTH_SHORT).show()
}
/**
* 关闭,部分广告不支持
*/
override fun onNativeExpressAdClose() {
Toast.makeText(activity, "广告关闭", Toast.LENGTH_SHORT).show()
val pos = holder.position
adList.remove(pos)
notifyItemRemoved(pos)
}
})
// 手动渲染广告
ad.render(activity)
}
}