跳到主要内容

2.3.广告样式

mediation目前支持的广告形式包括横幅广告、插屏广告、原生广告、开屏广告、激励视频 5种广告类型,接入方式各有不同,可参考接下来的各广告形式的接入方式说明。

警告
  • 所有广告操作请在主线程执行
  • 不可多进程同时初始化SDK
  • 所有Ad应一次loadAd()对应一次show(),这样可保证每次拿到都是最优广告,不要一次loadAd()多次show()
  • 避免同一个对象多次loadAd(),因为同一个对象多次loadAd()会覆盖上一次请求到的广告。

2.3.1 Banner 广告

简介

在App的顶部,中部或底部的图片。支持的广告尺寸: 20:3、3:2,效果图如下:

20:33:2

接入步骤

2.3.1.1. 添加TBannerView

首先在要展示Banner广告的⻚面中加入TBannerView,可以在对应的xml文件中加入:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#e8e8e8"
android:orientation="vertical">
<com.hisavana.mediation.ad.TBannerView
android:id="@+id/bannerview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true" />
</RelativeLayout>

2.3.1.2 初始化广告对象

//banner_1 is slot id
tBannerView.setAdSize(BannerSize.SIZE_320x50);
tBannerView.setAdUnitId("banner_1");
//adview.setBannerType(IBannerType.BANNER_TYPE_TOP_FOLD); 可选项,如果想要接入admob折叠banner,可以设置该属性

2.3.1.3 构建广告请求

TAdRequestBody tAdRequest = new TAdRequestBody.AdRequestBodyBuild()
.setAdListener(new TAdAlliance(this))
.build();
tBannerView.setRequestBody(tAdRequest);

2.3.1.4 开始请求广告

loadAd() 方式请求广告会在设置的等待时间内有最优广告返回则回调给客户端。

tBannerView.loadAd();

2.3.1.5 广告事件

监听广告的请求、填充、展示、点击的回调如下:

 
private static class TAdAlliance extends TAdListener {
@Override
public void onStart(int source){
// Request start
}
@Override
public void onLoad() {
// Request success
}
@Override
public void onError(TAdErrorCode errorCode) {
// Request failed
}
@Override
public void onShow(int source) {
// Called when an ad is displayed
}
@Override
public void onClicked(int source) {
// Called when an ad is clicked
}
@Override
public void onClosed(int source) {
// Called when an ad close
}
@Override
public void onShowError(TAdErrorCode errorCode) {
// Called when an ad show failed
}
}
警告
  • sdk2.6.8.0+ onLoadonLoad(int source)改为onLoad()。
  • sdk2.1.0.5+ 中 onLoad()、onShow()、onClicked()、onClosed()方法更改为 onLoad(int source)、 onShow(int source)、onClicked(int source)、onClosed(int source)。
  • source表示广告源,取值如下: Ssp=0; Admob=1; fan=2; Applovin=3; Unity=4; Iron_source=5; Pangle=6; Inmobi=8; Vungle=12; Adcolony=11; 比如:此次广告填充展示的是pangle广告,那么source=6。

2.3.1.6 销毁广告

当广告展示完成,退出该界面后销毁该广告。

@Override
protected void onDestroy() {
super.onDestroy();
if (adview != null) {
adview.destroy();
adview.removeAllViews();
adview = null;
}
}

TBannerView 是Banner广告的占位View,需要⻓宽至少大于 TAdBannerSize 的尺寸,否则广告显示将出现错误。使用admob的adaptivebanner时,Banner Size需使用320 * 50

Banner Size

Size dp (单位: dp)BannerSize constant
320*50SIZE_320x50
320*90SIZE_320x90
320*100SIZE_320x100
320*250SIZE_320x250

Banner 类型

Banner 类型IBannerType constant
BANNER_TYPE_TOP_FOLD顶部折叠banner广告
BANNER_TYPE_BOTTOM_FOLD底部折叠banner广告
BANNER_TYPE_NORMAL普通banner广告

2.3.1.7 其它API

  adview.resume();
adview.pause();

说明:添加Mintergral广告源时,当系统的onResume、onPause被调用时候,媒体需要主动调用以上两个生命周期回调方法,会减少Mintergral广告源错误数量的产生。

2.3.2 插屏广告

简介

当用户打开或切换到您的应用程序时出现的广告格式。 支持的广告尺寸1:1、9:16、3:2,效果图如下:

1:19:163:2

接入广告

2.3.2.1 初始化广告对象

mTInterstitialAd = new TInterstitialAd(this, "interstitial_1");

2.3.2.2 广告事件

监听广告的请求、填充、展示、点击的回调如下:

 
private static class TAdAlliance extends TAdListener {
@Override
public void onStart(int source){
// Request start
}
@Override
public void onLoad() {
// Request success
}
@Override
public void onError(TAdErrorCode errorCode) {
// Request failed
}
@Override
public void onShow(int source) {
// Called when an ad is displayed
}
@Override
public void onClicked(int source) {
// Called when an ad is clicked
}
@Override
public void onClosed(int source) {
// Called when an ad close
}
@Override
public void onShowError(TAdErrorCode errorCode) {
// Called when an ad show failed
}
}

2.3.2.3 构建请求体

TAdRequestBody tAdRequest = new TAdRequestBody.AdRequestBodyBuild()
.setAdListener(new TAdAlliance(this))
.build();

mTInterstitialAd.setRequestBody(tAdRequest);

2.3.2.4 请求广告

mTInterstitialAd.loadAd();

2.3.2.5 到达广告场景

String sceneToken = mTInterstitialAd.enterScene("interstitial_scene_id");

2.3.2.6 展示广告

if (mTInterstitialAd != null && mTInterstitialAd.hasAd()) {
mTInterstitialAd.show(context,sceneToken);
}

2.3.2.7 销毁广告

if (mTInterstitialAd != null) {
mTInterstitialAd.destroy();
mTInterstitialAd = null;
}

2.3.2.8 其他API

mTInterstitialAd.hasAd()

说明:用来判断广告是否在有效期,在展示广告前使用。

2.3.3 Native广告

简介

信息流,包括大图和小图,文字和按钮。渲染方式是自渲染。 自渲染:由媒体确定实际展现样式。在您的Apk中展示Native广告,当您使用Native API接入广告时,您将创建以 下原生广告。

sdk2.6.3.0+自渲染新增支持iconads广告类型。即单次请求时能够一次向广告源请求多条广告,且能够同时将拿到 的多条广告同时填充给媒体进行展现。接入方式和native一样,展示效果如下图:

接入步骤

2.3.3.1 添加TAdNativeView

首先在要展示原生广告的布局文件中加入TAdNativeView

<com.hisavana.mediation.ad.TAdNativeView
android:id="@+id/native_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/load_content" />

2.3.3.2 新建布局文件

新建一个Native广告元素的布局文件native_install.xml,其中广告元素中的icon用TIconView渲染,大图用 TMediaView渲染 , 如下代码:

 
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ad_unit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/item_background"
tools:ignore="MissingDefaultResource">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingTop="10dp"
android:paddingBottom="10dp">
<com.hisavana.mediation.ad.TIconView
android:id="@+id/native_ad_icon"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="5dp"
android:paddingRight="16dp">
<TextView
android:id="@+id/native_ad_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:ellipsize="end"
android:lines="1"
android:text="Title"
android:textColor="@android:color/black"
android:textSize="18sp" />
<TextView
android:id="@+id/native_ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:text="des1"
android:textColor="@android:color/black"
android:textSize="15sp" />
<TextView
android:id="@+id/des2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:text=""
android:textColor="@android:color/black"
android:textSize="15sp" />
<RatingBar
android:id="@+id/rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:isIndicator="false"
android:numStars="5"
android:stepSize="0.5"/>
</LinearLayout>
</LinearLayout>
<com.hisavana.mediation.ad.TMediaView
android:id="@+id/coverview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/call_to_action"
android:paddingVertical="10dp"
android:layout_marginHorizontal="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="DOWNLOAD NOW!"
android:gravity="center"
android:textAllCaps="false" />
</LinearLayout>
<!-- 广告⻆标 -->
<com.hisavana.mediation.ad.TAdChoicesView
android:id="@+id/adChoicesView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="150dp"
android:layout_marginTop="100dp" />
<com.hisavana.mediation.ad.TAdCloseView
android:id="@+id/adCloseView"
android:layout_toLeftOf="@+id/adChoicesView"
android:layout_width="12dp"
android:layout_height="12dp"/>
<com.hisavana.mediation.ad.TStoreMarkView
android:id="@+id/store_mark_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
</RelativeLayout>

2.3.3.3 初始化广告对象

tNativeAd = new TNativeAd(this, "native_1");

2.3.3.4 广告事件

监听广告的请求、填充、展示、点击的回调如下:

 
private static class TAdAlliance extends TAdListener {
@Override
public void onStart(int source){
// Request start
}
@Override
public void onLoad() {
// Request success
}
@Override
public void onError(TAdErrorCode errorCode) {
// Request failed
}
@Override
public void onNativeFeedShow(int source, TAdNativeInfo adNativeInfo){
// Called when a native ad is displayed
}
@Override
public void onNativeFeedClicked(int source, TAdNativeInfo adNativeInfo) {
// Called when a native ad is clicked
}
@Override
public void onClosed(@Nullable TAdNativeInfo tAdNativeInfo) {
// Called when a native ad close
}
@Override
public void onShowError(TAdErrorCode errorCode) {
// Called when an ad show failed
}
}

2.3.3.5 开始请求广告

请求广告时会回调广告监听的 onLoad(List<TAdNativeInfo> tAdNativeInfos) 方法并返回最优的广告,如下:

TAdRequestBody requestBody = new TAdRequestBody.AdRequestBodyBuild()
.setAdListener(new TAdListener())
.build();
tNativeAd.setRequestBody(requestBody);
tNativeAd.loadAd()

说明:广告的主图和标题是必填项,其它(如广告icon,广告描述等)为可选项,需要媒体根据可选项是否有返回值调整布局TAdNativeInfo

  • sdk2.6.8.0+ 中onLoad(List tAdNativeInfos, int source)方法更改为onLoad()。
  • sdk2.1.0.5+ 中onLoad(List tAdNativeInfos)onShow()onClicked()onClosed()、 方法更改为onLoad(List tAdNativeInfos, int source)onShow(int source)onClicked(int source)onClosed(int source)
  • source表示广告源,取值如下: Ssp=0; Admob=1; fan=2; Applovin=3; Unity=4; Iron_source=5; Inmobi=8; Vungle=12; Adcolony=11; Pangle=6; 比如:此次广告填充展示的是pangle广告,那么source = 6。

2.3.3.6 到达场景

String sceneToken = tNativeAd.enterScene("native_scene_id");

2.3.3.7 渲染广告

广告请求成功后渲染广告, 建议在有网络的时候展示广告。

警告
  1. 当广告位为icon类型时,不需要设置主图,只需要设置icon即可。
  2. 如果接入的sdk版本是2.2.0.0+,需要添加storeMarkView(应用商店标识),否则会影响下载广告的跳转链路
...
// 1. 获取广告
Arraylist<TAdNativeInfo> adInfos = tnativeAd.getNativeAdInfo(); // 该方法需要注意,当调用getNativeAdInfo后,会从SDK中获取一个广告的List对象,该对象需要用户持有
TAdNativeInfo nativeInfo = adInfos.size()>0 ? adInfos.get(0):null

// 2. 绑定布局
if(nativeInfo == null) return;
if (nativeInfo != null) {
nativeInfo.release();
}
ViewBinder viewBinder = new ViewBinder.Builder(R.layout.native_install)
.titleId(R.id.native_ad_title)
.iconId(R.id.native_ad_icon)
.callToActionId(R.id.call_to_action)
.descriptionId(R.id.native_ad_body)
.mediaId(R.id.coverview)
.adChoicesView(R.id.adChoicesView) //广告⻆标
.adCloseView(R.id.adCloseView)
.storeMarkView(R.id.store_mark_view)//sdk2.2.0.1新增API,storeMarkView是应用商店标识
.contextMode(NativeContextMode.NORMAL)
.iconDrawable(iconDrawable) // 更改icon类容 SDK2.3.2版本支持
.build();
tNativeAd.bindNativeView(nativeView, nativeInfo, viewBinder,sceneToken);

2.3.3.8 关闭广告

  @Override
public void onClosed(TAdNativeInfo tAdNativeInfo) {
//sdk2.1.0.1+版本新增,点击广告的关闭按钮时回调,可以在回调中选择调用destroyShow()
//来销毁广告。如果在列表中使用,可根据taNativeInfo来确定当前的广告在列表中的位置,动态的删除
if(tAdNativeInfo == mNativeInfo){
destroyShow();
}
}
public void destroyShow() {
if(mNativeInfo != null) {
mNativeInfo.release();
}
if (nativeView != null) {
nativeView.release();
}
mNativeInfo = null;
nativeView = null;
}

2.3.3.9 信息流代码示例

//定义一个数据类,用于保存TAdNativeInfo和sceneToken
public calss ItemBean{
private TAdNativeInfo nativeInfo;
private TNativeAd nativeAd;
public String sceneToken;
}
// 在列表中绑定布局
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder vhHolder, int position) {
if (getItemViewType(position) == AD) {
ItemBean itemBean = data.get(position);
// 进入了广告场景,获取广告数据
if(TextUtils.isEmpty(itembean.sceneToken)){
itembean.sceneToken = tNativeAd.enterScene("scene_id");
}
List<TAdNativeInfo> nativeInfos = tNativeAd.getNativeInfo();
itemBean.nativeInfo = nativeInfos.isEmpty ? null : nativeInfos.get(0)
if(itemBean.nativeInfo == null || itemBean.nativeInfo.isExpired()){
itemBean.nativeAd.loadAd();
return;
}
//用户构建ViewBinder
...
//展示广告
itemBean.tNativeAd.bindNativeView(nativeView, itemBean.nativeInfo, viewBinder, itemBean.sceneToken);
} else {
...
}
}

说明:关于在信息流中使用enterScene的时机,我们建议是当到达需要展示广告的item时,调用一次enterScene,并且将返回的Token值保留,避免重复调用enterScene。
详细的使用可以参考DEMO样例:
信息流接入https://github.com/Hisavana-Developer/Hisavana_Mediation_Demo/blob/master/app/src/main/java/com/hisavana/ssp/ui/NativeAdInListActivity.java
Icon类接入https://github.com/Hisavana-Developer/Hisavana_Mediation_Demo/blob/master/app/src/main/java/com/hisavana/ssp/ui/IconAdActivity.kt

2.3.3.10 自定义广告可点击元素

如果需要自定义广告点击事件,则调用ViewBinder里的actionIds(Integer... actionIds)方法

// actionIds
ViewBinder b = new ViewBinder.Builder(R.layout.native_install)
.titleId(R.id.native_ad_title) // 设置标题控件的id
.iconId(R.id.native_ad_icon) //设置icon控件的id
.callToActionId(R.id.call_to_action) // 设置按钮控件的id
.descriptionId(R.id.native_ad_body) // 设置描述控件的id
.mediaId(R.id.coverview) // 设置广告主图控件的id
.actionIds(R.id.ad_action, R.id.coverview) //点击事件添加
.ratingId(R.id.rating)//sdk1.2.1.8支持,控件是RatingBar
.priceId(R.id.price) //sdk1.2.1.8支持
.build();

相关政策:

  1. 只有广告标题、网址、号召性用语和图片素材资源是可点击的(禁止使用可点击的“空白”区域)。
  2. 广告的背景必须是不可点击的。如果使用图片要素作为广告背景,该图片必须是不可点击的。

2.3.3.11 销毁广告

当一个广告使用完后,下次不再使用即可销毁 调用mNativeInfo.release()即可。

  @Override
protected void onDestroy() {
if (tNativeAd != null) {
tNativeAd.destroy();
tNativeAd = null;

}
if (mNativeInfo != null) {
mNativeInfo.release();
}
if (nativeView != null) {
nativeView.release();
}
layout = null;
mNativeInfo = null;
nativeView = null;
super.onDestroy();
}

2.3.3.12 其它API

在skd1.3.0+新增API,用来判断广告是否在有效,在展示广告前使用。

adNativeInfo.isExpired()

2.3.4 开屏广告

简介

出现在自然端点和过渡段的广告样式,支持的广告尺寸9:16、1:2、2:3,效果如图:

9:161:22:3

接入步骤

2.3.4.1 添加TSplashView

首先在要展示开屏广告的布局文件中加入TSplashView 如下:

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.hisavana.mediation.ad.TSplashView
android:id="@+id/splash_ad"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/logo"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

2.3.4.2 广告事件

监听广告的请求、填充、展示、点击的回调如下:

 
private static class TAdAlliance extends TAdListener {
@Override
public void onStart(int source){
// Request start
}
@Override
public void onLoad () {
// Request success
}
@Override
public void onError(TAdErrorCode errorCode) {
// Request failed
}
@Override
public void onShow(int source) {
// Called when an ad is displayed
}
@Override
public void onClicked(int source) {
// Called when an ad is clicked
}
@Override
public void onClosed(int source) {
// Called when an ad close
}
@Override
public void onShowError(TAdErrorCode errorCode) {
// Called when an ad show failed
}
}

2.3.4.3 初始化开屏广告对象

TSplashView tSplashView = findViewById(R.id.splash_ad);
TSplashAd tSplashAd = new TSplashAd(this, "splash_id");

2.3.4.4 构建请求体

tSplashAd.setRequestBody(
new TAdRequestBody.AdRequestBodyBuild()
.setAdListener(new TAdAlliance()).build());

2.3.4.5 设置跳过监听

tSplashAd.setOnSkipListener(new TOnSkipListener());
private class TOnSkipListener implements OnSkipListener {
@Override
public void onClick() {
SplashAdActivity.this.finish();
ToastUtil.showLongToast("skip button click");
}
@Override
public void onTimeReach() {
ToastUtil.showLongToast("time reach");
}
}

2.3.4.6 进入广告场景

String sceneToken = tSplashAd.enterScene();

2.3.4.7 请求广告

tSplashAd.loadAd();

2.3.4.8 展示广告

  tSplashAd.showAd(TSplashView,sceneToken);

允许媒体传入logo和名称,sdk内部渲染底部媒体logo信息,底部区域为手机屏幕高度的20%。效果如图:

  tSplashAd.showAd(TSplashView, logoLayout,sceneToken);

2.3.4.9 关闭广告

@Override
public void onClosed() {
//sdk2.1.0.0+版本新增,收到回调后可以选择调用tSplashAd.destory()关闭广告
if(tSplashAd != null){
tSplashAd.destroy();
tSplashAd = null;
}
}

2.3.4.10 销毁广告

@Override
protected void onDestroy() {
super.onDestroy();
if(tSplashAd != null){
tSplashAd.destroy();
tSplashAd = null;
}
}

2.3.4.11 其它API

tSplashAd.hasAd()

说明:判断当前是否存在可用广告

  TSplashAd.resume();
TSplashAd.pause();

说明:添加Mintergral广告源时,当系统的onResume、onPause被调用时候,媒体需要主动调用以上两个生命周期回调方法,会减少Mintergral广告源错误数量的产生。

2.3.5 激励视频

简介

激励视频,一般在App的游戏页面展示。全屏播放广告后获得相应的奖励。

接入步骤

2.3.5.1.初始化激励视频对象

TVideoAd tVideoAd = new TVideoAd(this, "video_id");

2.3.5.2 构建请求体

 TAdRequestBody tAdRequest = new TAdRequestBody.AdRequestBodyBuild() .setAdListener(new TAdAlliance()) .build();
 tVideoAd.setRequestBody(tAdRequest); 

2.3.5.3 设置广告监听事件

监听广告的填充、展示、点击、关闭、获取激励视频奖励的回调如下:

private static class TAdAlliance extends TAdListener {
@Override
public void onStart(int source){
// Request start
}
@Override
public void onLoad() {
// Request success
}
@Override
public void onError(TAdErrorCode errorCode) {
// Request failed
}
@Override
public void onShow(int source) {
// Called when an ad is displayed
}
@Override
public void onClicked(int source) {
// Called when an ad is clicked
}
@Override
public void onClosed(int source) {
// Called when an ad close
}
@Override
public void onRewarded() {
// Video playback completed
}

}
警告
  • sdk2.6.8.0+ 中onLoad(List tAdNativeInfos, int source)更改为onLoad()
  • sdk2.1.0.5+ 中onLoad(List tAdNativeInfos)onShow()onClicked()onClosed()、 方法更改为onLoad(List tAdNativeInfos, int source)onShow(int source)onClicked(int source)onClosed(int source)
  • source表示广告源,取值如下: Ssp=0; Admob=1; fan=2; Applovin=3; Unity=4; Iron_source=5; Inmobi=8; Vungle=12; Adcolony=11; Pangle=6; 比如:此次广告填充展示的是pangle广告,那么source = 6。

2.3.5.4 请求广告

 tVideoAd.loadAd();

2.3.5.5 进入广告场景

String sceneToken = tVideoAd.enterScene("scene_id"); 

2.3.5.6 展示广告

if (tVideoAd != null) {
tVideoAd.show(activity,sceneTokenVide);
}

2.3.5.7 销毁广告

@Override 
protected void onDestroy() {
super.onDestroy();
if (null != tVideoAd) { tVideoAd.destroy(); }
}
警告

激励视频必须要添加admob或者facebook的依赖,否则会引起异常。

2.3.5.8 其它API

tVideoAd.hasAd()

说明:判断当前是否有可用的广告。