插屏广告 2.0
简介
权限等级:开放![]()
插屏2.0广告和插屏广告相比,只需要进行简单的切换,就可以在保证当前插屏渲染效果的前提下提升广告价格和填充率(注:插屏2.0接入需要在开发者平台创建插屏2.0广告位)
插屏2.0广告分为小规格图文(弹窗)、小规格纯图片(弹窗)和大规格纯图片(竖屏)、插屏横屏视频、插屏竖屏视频:
| 小规格图文(弹窗) | 小规格纯图片(弹窗) | 大规格纯图片(竖屏) |
|---|---|---|
![]() |
![]() |
![]() |
| 插屏横屏视频 | 插屏竖屏视频 |
|---|---|
![]() |
![]() |
主要API
UnifiedInterstitialAD
- com.qq.e.ads.interstitial2.UnifiedInterstitialAD:
插屏半屏广告入口,用于初始化并加载广告数据。
| 方法名 | 方法介绍 |
|---|---|
| UnifiedInterstitialAD(final Activity activity, final String posID,final UnifiedInterstitialADListener listener) | 构造函数 |
| loadAD() | 加载插屏半屏广告 |
| show() | 展示插屏半屏广告,有遮罩(展示使用loadAD()加载的广告) |
| getECPMLevel() | 获取本条广告实时的eCMP价格层级标签,每个层级标签对应线下预定的eCPM价格范围,成功返回一个包含数字的字符串,比如“1”,无权限调用该接口或后台异常会返回空字符串 |
| getECPM() | 获取本条广告实时的eCPM价格,单位是分 |
| isValid() | 广告是否有效,无效广告将无法展示 |
| close() | 关闭插屏半屏广告 |
| destroy() | 当不需要插屏半屏广告实例时调用此方法来主动释放资源 |
| getAdPatternType() | 获取广告样式,目前只支持AdPatternType.NATIVE_VIDEO |
| setMediaListener(UnifiedInterstitialMediaListener listener) | 设置监听器,监听视频广告的状态变化 |
| setVideoOption(VideoOption option) | (可选方法)指定视频广告的播放配置,配置包含: 1. autoPlayPolicy,指定不同网络下的视频播放策略,可选项包括:AutoPlayPolicy.WIFI(WiFi 网络自动播放,4G 网络手动点击播放),AutoPlayPolicy.ALWAYS(WiFi 和4G 网络都自动播放),默认值为 AutoPlayPolicy.ALWAYS。 2. autoPlayMuted,指定视频自动播放时是否静音,可选项包括:true(自动播放时静音),false(自动播放时有声),默认值为 true。 注:AutoPlayPolicy.ALWAYS 的配置能够一定程度优化广告收益 3. detailPageMuted,指定视频详情页是否静音播放,可选项包括:true(视频详情页静音播放),false(视频详情页有声播放),默认值为 false。 |
| setMinVideoDuration(int minVideoDuration) | 设置返回视频广告的最小视频时长(闭区间,可单独设置),单位:秒 此设置会影响广告填充,请谨慎设置 |
| setMaxVideoDuration(int maxVideoDuration) | 设置返回视频广告的最大视频时长(闭区间,可单独设置),单位:秒,合法输入为:5<=maxVideoDuration<=61. 此设置会影响广告填充,请谨慎设置 |
| getExtraInfo() | (4.410.1280新增)获取本条广告一些额外信息 |
UnifiedInterstitialADListener
- com.qq.e.ads.interstitial2.UnifiedInterstitialADListener:
插屏半屏广告加载、渲染、点击状态的回调。
| 方法名 | 方法介绍 |
|---|---|
| onNoAD(AdError error) | 广告加载或展示过程中出错,AdError中包含了错误码和错误描述,具体错误码内容可参考错误码部分 |
| onADReceive() | 插屏半屏广告加载完毕 |
| onVideoCached() | 插屏半屏视频广告,视频素材下载完成 |
| onADOpened() | 插屏半屏广告展开时回调 |
| onADExposure() | 插屏半屏广告曝光时回调 |
| onADClicked() | 插屏半屏广告点击时回调 |
| onADClosed() | 插屏半屏广告关闭时回调 |
| onADLeftApplication() | 插屏半屏广告点击离开应用时回调 |
| onRenderSuccess() | 插屏半屏广告渲染成功时回调,此回调后才可以调用 show 方法 |
| onRenderFail() | 插屏半屏广告渲染失败时回调 |
UnifiedInterstitialMediaListener
- com.qq.e.ads.interstitial2.UnifiedInterstitialMediaListener:
插屏半屏视频广告播放状态回调接口,专用于带有视频素材的广告对象
| 方法名 | 方法介绍 |
|---|---|
| onVideoInit() | 视频播放 View 初始化完成 |
| onVideoLoading() | 视频下载中 |
| onVideoReady(long videoDuration) | 视频播放器初始化完成,准备好可以播放了,videoDuration 是视频素材的时间长度,单位为 ms |
| onVideoStart() | 视频开始播放 |
| onVideoPause() | 视频暂停 |
| onVideoComplete() | 视频播放结束,自然播放到达最后一帧时都会触发 |
| onVideoError(AdError error) | 视频播放时出现错误,error 对象包含了错误码和错误信息,错误码的详细内容可以参考右侧快捷导航中的「错误码」 |
| onVideoPageOpen() | 进入视频落地页 |
| onVideoPageClose() | 退出视频落地页 |
接入注意事项
- 插屏半屏广告同一条广告不能重复曝光(一次load只能show一次)
- 插屏半屏广告展示调用(show)必须在ui线程内调用
- 插屏半屏广告给开发者的回调(UnifiedInterstitialADListener)全部执行在主线程中(异步回调)
- 尽量复用广告实例,不要实例化过多的广告实例,当广告实例不再使用时务必调用destory方法进行资源释放
如果您的插屏半屏广告位支持视频,您会在新建广告位时在广告素材栏看到视频选项。您需要注意以下几点:
- 您可以按需进行视频广告播放的个性化配置。
- 您需要处理好 Activity 的运行时变更,由于视频广告可以跟随手机屏幕的方向旋转和全屏播放,请处理好 Activity 的运行时变更(最简单的方式就是在 AndroidManifest 文件中给您的 Activity 加上 android:configChanges="keyboard|keyboardHidden|orientation|screenSize" 属性),不要让播放视频广告的 Activity 被销毁重建,具体代码可以参考 GDTUnionDemo。
- 如果广告位支持视频广告,强烈建议在拉取广告前,调用
setVideoOption设置视频广告的播放策略,有助于提高eCPM
代码接入示例
详细内容请参考压缩包中的代码示例
public class UnifiedInterstitialADActivity extends Activity implements OnClickListener,
UnifiedInterstitialADListener, CompoundButton.OnCheckedChangeListener {
private static final String TAG = UnifiedInterstitialADActivity.class.getSimpleName();
private UnifiedInterstitialAD iad;
private String posId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_unified_interstitial_ad);
((EditText) findViewById(R.id.posId)).setText(Constants.UNIFIED_INTERSTITIAL_ID_LARGE_SMALL);
this.findViewById(R.id.loadIAD).setOnClickListener(this);
this.findViewById(R.id.showIAD).setOnClickListener(this);
this.findViewById(R.id.showIADAsPPW).setOnClickListener(this);
this.findViewById(R.id.closeIAD).setOnClickListener(this);
((CheckBox) this.findViewById(R.id.cbPos)).setOnCheckedChangeListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (iad != null) {
iad.destroy();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.loadIAD:
iad = getIAD();
setVideoOption();
iad.loadAD();
break;
case R.id.showIAD:
showAD();
break;
case R.id.showIADAsPPW:
showAsPopup();
break;
case R.id.closeIAD:
close();
break;
default:
break;
}
}
private UnifiedInterstitialAD getIAD() {
String posId = getPosID();
if (iad != null && this.posId.equals(posId)) {
return iad;
}
this.posId = posId;
if (this.iad != null) {
iad.close();
iad.destroy();
iad = null;
}
if (iad == null) {
iad = new UnifiedInterstitialAD(this, posId, this);
iad.setMediaListener(this);
}
return iad;
}
private void showAD() {
if (iad != null && iad.isValid()) {
iad.show();
} else {
Toast.makeText(this, "请加载广告后再进行展示 ! ", Toast.LENGTH_LONG).show();
}
}
private void close() {
if (iad != null) {
iad.close();
} else {
Toast.makeText(this, "广告尚未加载 ! ", Toast.LENGTH_LONG).show();
}
}
private String getPosID() {
String posId = ((EditText) findViewById(R.id.posId)).getText().toString();
return TextUtils.isEmpty(posId) ? Constants.UNIFIED_INTERSTITIAL_ID_LARGE_SMALL : posId;
}
private void setVideoOption(){
VideoOption.Builder builder = new VideoOption.Builder();
VideoOption option = builder.build();
if(!btnNoOption.isChecked()){
option = builder.setAutoPlayMuted(btnMute.isChecked())
.setAutoPlayPolicy(networkSpinner.getSelectedItemPosition()).build();
}
iad.setVideoOption(option);
iad.setMaxVideoDuration(getMaxVideoDuration());
}
@Override
public void onADReceive() {
Toast.makeText(this, "广告加载成功 !建议在 onRenderSuccess 回调之后再调用 show() 展示!", Toast.LENGTH_LONG).show();
}
@Override
public void onNoAD(AdError error) {
String msg = String.format(Locale.getDefault(), "onNoAD, error code: %d, error msg: %s",
error.getErrorCode(), error.getErrorMsg());
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
@Override
public void onADOpened() {
Log.i(TAG, "onADOpened");
}
@Override
public void onADExposure() {
Log.i(TAG, "onADExposure");
}
@Override
public void onADClicked() {
Log.i(TAG, "onADClicked");
}
@Override
public void onADLeftApplication() {
Log.i(TAG, "onADLeftApplication");
}
@Override
public void onADClosed() {
Log.i(TAG, "onADClosed");
}
@Override
public void onRenderSuccess() {
Log.i(TAG, "onRenderSuccess,建议在此回调后再调用展示方法");
}
@Override
public void onRenderFail() {
Log.i(TAG, "onRenderFail");
}
@Override
public void onVideoInit() {
Log.i(TAG, "onVideoInit");
}
@Override
public void onVideoLoading() {
Log.i(TAG, "onVideoLoading");
}
@Override
public void onVideoReady(long videoDuration) {
Log.i(TAG, "onVideoReady, duration = " + videoDuration);
}
@Override
public void onVideoStart() {
Log.i(TAG, "onVideoStart");
}
@Override
public void onVideoPause() {
Log.i(TAG, "onVideoPause");
}
@Override
public void onVideoComplete() {
Log.i(TAG, "onVideoComplete");
}
@Override
public void onVideoError(AdError error) {
Log.i(TAG, "onVideoError, code = " + error.getErrorCode() + ", msg = " + error.getErrorMsg());
}
@Override
public void onVideoPageOpen() {
Log.i(TAG, "onVideoPageOpen");
}
@Override
public void onVideoPageClose() {
Log.i(TAG, "onVideoPageClose");
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
((EditText) findViewById(R.id.posId)).setText(Constants.UNIFIED_INTERSTITIAL_ID_LARGE_SMALL);
} else {
((EditText) findViewById(R.id.posId)).setText(Constants.UNIFIED_INTERSTITIAL_ID_ONLY_SMALL);
}
}
}




