2.3. 广告形式
hisavana目前支持的广告形式包括 横幅广告、插屏广告、原生广告、开屏广告等4种广告类型,接入方式各有不同,可参考接下来的各广告形式的接入方式说明。
- 所有广告操作请在主线程执行
- 不可多进程同时初始化SDK
- 确保在初始化广告SDK后再进行广告请求
- 所有Ad应一次loadAd()对应一次show(),这样可保证每次拿到都是最优广告,不要一次loadAd()多次show()
- 避免同一个对象多次loadAd(),因为同一个对象多次loadAd()会覆盖上一次请求到的广告。
2.3.1 Banner 广告
简介
在App的顶部,中部或底部的图片。支持的广告尺寸:20:3、3:2,效果图如下:
20:3 | 3:2 |
---|---|
![]() ![]() | ![]() |
接入步骤
2.3.1.1 添加TBannerView
首先在要展示Banner广告的页面中加入TBannerView,可以在对应的xml 文件中加入(如下在页面的头部显示该广告):
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.cloud.hisavana.sdk.api.adx.TBannerView
android:id="@+id/bannerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_test"
android:background="@drawable/gd_border_radius_4" />
</RelativeLayout>
2.3.1.2 初始化广告对象
// banner is slot id
tBannerView.setPlacementId("banner_id");
tBannerView.setListener(new Listener() {
@Override
public void onError(TaErrorCode adError) {
Log.d(TAG,"Ad request failed");
}
@Override
public void onAdLoaded() {
Log.d(TAG,"Ad request successful");
}
@Override
public void onAdClicked(DownUpPointBean pointBean) {
Log.d(TAG,"Ad click callback");
}
@Override
public void onAdShow() {
Log.d(TAG,"Ad show callback");
}
@Override
public void onTimeOut() {
Log.d(TAG,"Ad request timeout");
}
@Override
public void onBiddingSuccess(BidInfo bidInfo) {
//New in version 2.0.1.1+
Log.d(TAG,"Ad bidding successful");
}
@Override
public void onBiddingFailed(TaErrorCode adError) {
//New in version 2.0.1.1+
Log.d(TAG,"Ad bidding failed");
}
@Override
public void onAdClosed(TBannerView bannerView) {
Log.d(TAG,"Ad close callback");
}
});
2.3.1.3 开始请求广告
loadAd() 方式请求广告。
tBannerView.loadAd();
2.3.1.4 展示广告
if (tBannerView != null && tBannerView.isAdValid()) {
tBannerView.show();
}
2.3.1.5 关闭广告
@Override
public void onAdClosed(TBannerView tBannerView) {
//sdk2.1.0.0+版本新增,在触发关闭后可调用adview.destroy()关闭广告
if(tAdBannerView != null){
tAdBannerView.destroy();
tAdBannerView = null;
}
}
2.3.1.6 销毁广告
当广告展示完成,退出该界面后销毁该广告。
@Override
protected void onDestroy() {
super.onDestroy();
if (tBannerView != null) {
tBannerView.destroy();
tBannerView.removeAllViews();
tBannerView = null;
}
}
2.3.1.7 其它API
tAdBannerView.getFillAdType();
说明:⽤来判断填充的广告是属于离线还是在线广告,1:离线广告 0:在线广告 -1:无填充。
tAdBannerView.setBidding(true) //设置为竞价模式
tAdBannerView.loadAd() //发起广告请求,返回价格信息
tAdBannerView.loadAd(BidInfo bidInfo) //获取价格信息后,通过价格信息下载广告素材
说明:SDK2.0.1.1+版本新增了HeaderBidding功能,增加了以上两个API。
TBannerView
- TBannerView是Banner广告的占位View,banner广告默认宽度占满父布局,高度根据运营广告位配置不同比例自动计算。
2.3.2 插屏广告
简介
当用户打开或切换到您的应用程序时出现的广告格式。 支持的广告尺寸1:1、9:16、3:2,效果图如下:
1:1 | 9:16 | 3:2 |
---|---|---|
![]() | ![]() | ![]() |
接入步骤
2.3.2.1 初始化广告对象
TInterstitial mAdInterstitial = new TInterstitial("interstitial");
mAdInterstitial.setListener(new AdListener() {
@Override
public void onError(TaErrorCode adError) {
Log.d(TAG,"Ad request failed");
}
@Override
public void onAdLoaded() {
Log.d(TAG,"Ad request successful");
}
@Override
public void onAdClicked(DownUpPointBean pointBean) {
Log.d(TAG,"Ad click callback");
}
@Override
public void onAdShow() {
Log.d(TAG,"Ad show callback");
}
@Override
public void onTimeOut() {
Log.d(TAG,"Ad request timeout");
}
@Override
public void onBiddingSuccess(BidInfo bidInfo) {
//New in version 2.0.1.1+
Log.d(TAG,"Ad bidding successful");
}
@Override
public void onBiddingFailed(TaErrorCode adError) {
//New in version 2.0.1.1+
Log.d(TAG,"Ad bidding failed");
}
@Override
public void onAdClosed() {
Log.d(TAG,"Ad close callback");
}
});
2.3.2.2 请求广告
mAdInterstitial.loadAd();
2.3.2.3 展示广告
if (mAdInterstitial != null) {
mAdInterstitial.show();
}
2.3.2.4 销毁广告
if (mAdInterstitial != null) {
mAdInterstitial.destroy();
mAdInterstitial = null;
}
2.3.2.5 其它API
mAdInterstitial.getFillAdType();
说明:⽤来判断填充的广告是属于离线还是在线广告,1:离线广告 0:在线广告 -1:无填充。
mAdInterstitial.setBidding(true) //设置为竞价模式
mAdInterstitial.loadAd() //发起广告请求,返回价格信息
mAdInterstitial.loadAd(BidInfo bidInfo) //获取价格信息后,通过价格信息下载广告素材
说明:SDK2.0.1.1+版本新增了HeaderBidding功能,增加了以上两个API。
2.3.3 Native广告
简介
信息流,包括大图和小图,文字和按钮。分为自渲染和模板渲染。
自渲染:由媒体确定实际展现样式。在您的App中展示Native广告,当您使用hisavana API接入广告时,您将创建以下原生广告。
模板渲染(适用于sdk版本2.1.0.0+):由sdk确定实际展现样式。sdk根据服务端下发的模板类型匹配模板,进行渲染,媒体可以微调展现样式。支持上图下文、下图上文、左图右文、右图左文,竖图文、全屏图。效果如图:
上图下文 | 下图上文 | 左图右文 |
![]() | ![]() | ![]() |
建议不限制布局高度 |
右图左文 | 竖图文 | 全屏图 |
---|---|---|
![]() | ![]() | ![]() |
建议不限制布局高度 | 建议不限制布局高度,建议限制布局宽度 | 建议布局宽高是match_parent |
接入步骤
2.3.3.1 添加TAdNativeView
首先在要展示原生广告的布局文件中加入TNativeView
<com.cloud.hisavana.sdk.api.view.TNativeView
android:id="@+id/native_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
2.3.3.2 新建布局文件
新建一个Native广告元素的布局文件native_install.xml,其中广告元素中的icon用ImageView渲染,大图用MediaView渲染 , 如下代码:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/ad_unit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@mipmap/item_background">
<com.cloud.hisavana.sdk.api.view.MediaView
android:id="@+id/coverview"
android:layout_width="match_parent"
android:layout_height="200dp"
tools:background="#22000000"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"/>
<com.cloud.hisavana.sdk.api.view.AdChoicesView
android:id="@+id/ad_choice"
android:layout_width="@dimen/dp_12"
android:layout_height="@dimen/dp_12"
app:layout_constraintLeft_toRightOf="@+id/native_ad"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/native_ad"
android:layout_width="@dimen/dp_12"
android:layout_height="@dimen/dp_12"
android:src="@drawable/hisavana_ad_big"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent">
</ImageView>
<ImageView
android:id="@+id/native_ad_icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
tools:background="#22000000"
app:layout_constraintTop_toBottomOf="@+id/coverview"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="10dp"/>
<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:textColor="@android:color/black"
android:textSize="18sp"
tools:text="Title"
android:layout_marginTop="10dp"
android:layout_marginLeft="10dp"
app:layout_constraintTop_toBottomOf="@+id/coverview"
app:layout_constraintLeft_toRightOf="@+id/native_ad_icon"/>
<TextView
android:id="@+id/native_ad_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@android:color/black"
android:textSize="15sp"
tools:text="des\ndes"
android:layout_marginLeft="10dp"
app:layout_constraintTop_toBottomOf="@+id/native_ad_title"
app:layout_constraintLeft_toRightOf="@+id/native_ad_icon"/>
<TextView
android:id="@+id/rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rating"
app:layout_constraintTop_toBottomOf="@+id/native_ad_body"
android:layout_marginLeft="10dp"
app:layout_constraintLeft_toRightOf="@+id/native_ad_icon"/>
<Button
android:id="@+id/call_to_action"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="DOWNLOAD NOW!"
android:textAllCaps="false"
android:layout_marginTop="10dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/rating" />
<com.cloud.hisavana.sdk.api.view.StoreMarkView
android:id="@+id/ps_mark_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/call_to_action"
app:layout_constraintEnd_toEndOf="parent" />
<com.cloud.hisavana.sdk.api.view.AdCloseView
android:id="@+id/hisavana_ad_close"
android:layout_width="20dp"
android:layout_height="20dp"
tools:ignore="MissingConstraints"
android:layout_margin="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
- sdk在2.5.3.0版本上将
com.cloud.hisavana.sdk.api.view.PsMarkView
更改为com.cloud.hisavana.sdk.api.view.StoreMarkView
- 建议MediaView根据具体的场景给一个具体的高度,避免因广告的渲染导致页面出现抖动
2.3.3.3 初始化广告对象
nativeAd = new TNative("native");
nativeAd.setListener(new AdListener() {
@Override
public void onError(TaErrorCode adError) {
Log.d(TAG,"Ad request failed");
}
@Override
public void onAdLoaded(TaNativeInfo taNativeInfo) {
Log.d(TAG,"Native or icon ad request successful");
}
@Override
public void onNativeAdClick(TaNativeInfo taNativeInfo) {
//New in version 2.8.0.0+
Log.d(TAG,"Native or icon ad click callback");
}
@Override
public void onNativeAdShow(TaNativeInfo taNativeInfo) {
//New in version 2.8.0.0+
Log.d(TAG,"Native or icon ad show callback");
}
@Override
public void onTimeOut() {
Log.d(TAG,"Ad request timeout");
}
@Override
public void onBiddingSuccess(BidInfo bidInfo) {
//New in version 2.0.1.1+
Log.d(TAG,"Ad bidding successful");
}
@Override
public void onAdClosed(TaNativeInfo taNativeInfo) {
Log.d(TAG,"Native or icon ad close callback");
}
});
2.3.3.4 开始请求广告
请求广告成功后会回调广告监听的 onLoad(List<TaNativeInfo> adInfos)
方法,如下:
nativeAd.loadAd()
@Override
public void onLoad(List<TaNativeInfo> adInfos) {
super.onLoad();
}
说明:广告的主图和标题是必填项,其它(如广告icon,广告描述等)为可选项,需要媒体根据可选项是否有返回值调整布局,详细参考TaNativeInfo
2.3.3.5 渲染广告
广告请求成功后渲染广告。
- nativeAd.registerViews(nativeView, adContains, adNativeInfo);必须正确调用,否则会影响广告展示统计。
- 当广告位为icon类型时,不需要设置主图,只需要设置icon即可。
- 如果接入的sdk版本是2.2.0.0-2.3.1.4,需要添加psMarkView(应用商店标识),否则会影响下载广告的跳转链路 如果接入的sdk版本是2.5.3.0+,需要添加StoreMarkView(应用商店标识),否则会影响下载广告的跳转链路
....
@Override
public void onLoad(List<TaNativeInfo> adInfos1) {
inflateView(adInfos1.get(0),nativeAd)
}
private void inflateView(TaNativeInfo adNativeInfo, TNative nativeAd) {
ConstraintLayout adView = (ConstraintLayout)LayoutInflater.from(this).inflate(R.layout.ad_unit, null);
ImageView icon = adView.findViewById(R.id.native_ad_icon);
MediaView mediaView = adView.findViewById(R.id.coverview);
AdChoicesView adChoicesView = adView.findViewById(R.id.ad_choice);
AdCloseView adCloseView = adView.findViewById(R.id.hisavana_ad_close);
TextView title = adView.findViewById(R.id.native_ad_title);
TextView des = adView.findViewById(R.id.native_ad_body);
Button calltoaction = adView.findViewById(R.id.call_to_action);
TextView rating = adView.findViewById(R.id.rating);
nativeView.destroy();
nativeView.addView(adView);
nativeView.setIconView(icon);
nativeView.setMediaView(mediaView, ImageView.ScaleType.FIT_XY);
nativeView.setAdChoiceView(adChoicesView);
//sdk2.1.0.2新增api,adCloseView是关闭按钮
nativeView.setAdCloseView(adCloseView);
//sdk2.2.0.1新增api,psMarkView是应用商店标识
nativeView.setPsMarkView(psMarkView);
title.setText(adNativeInfo.getTitle());
des.setText(adNativeInfo.getDescription());
calltoaction.setText(adNativeInfo.getCtatext());
if (!TextUtils.isEmpty(adNativeInfo.getRating())) {
rating.setText("R : " + adNativeInfo.getRating());
}
List<View> adContains = new ArrayList<>();
adContains.add(title);
adContains.add(icon);
adContains.add(mediaView);
adContains.add(calltoaction);
adContains.add(des);
adContains.add(adView);
adContains.add(adCloseView);
adContains.add(psMarkView);
nativeView.setupViews(adNativeInfo);//渲染native广告 sdk2.2.0.1之前需要调用
nativeAd.registerViews(nativeView, adContains, adNativeInfo);//渲染native广告,注册监听
}
2.3.3.6 模板渲染广告(sdk2.1.0.0+支持)
在媒体配置平台设置代码位id的渲染方式为模板渲染时,需使用以下api渲染广告
nativeAd.registerViews(nativeView, adNativeInfo);
媒体配置平台设置

模板样式微调api
TemplateStyle templateStyle;
if (isChangeStyle) {
templateStyle = new TemplateStyle.Builder()
.titleSize(20).titleColor(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_0051E1)).isTitleBold(0)
.descColor(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_0051E1)).descSize(20).isDescBold(1)
.callToAction_text_color(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_0051E1)).callToAction_text_isBold(1).callToAction_text_size(20)
.callToAction_background_color(CoreUtil.getContext().getResources().getColor(R.color.ad_button_bg_color))
.callToAction_corner_radius(0).callToAction_stroke_color(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_0051E1)).callToAction_stroke_width(5)
//.callToAction_background_shape(getResources().getDrawable(R.drawable.hisavana_bg_shadow))
//.callToAction_background_shape(getResources().getDrawable(R.drawable.item_background))
.background(CoreUtil.getContext().getResources().getColor(R.color.hisavana_ad_color_787878))
.build();
} else {
templateStyle = new TemplateStyle.Builder().build();
}
nativeView.setTemplateStyle(templateStyle);
2.3.3.7 关闭广告
@Override
public void onAdClosed(TaNativeInfo taNativeInfo) {
//sdk2.1.0.0+版本新增,点击广告的关闭按钮时回调,可以在回调中选择调用destroyShow()来销毁广告,
//如果在列表中使用,可根据taNativeInfo来确定当前的广告在列表中的位置,动态的删除
if(null != tNativeView){
tNativeView.destroy();
taNativeInfo.destroy();
}
}
2.3.3.8 销毁广告
@Override
protected void onDestroy() {
super.onDestroy();
//释放TaNativeInfo资源
for (TaNativeInfo taNativeInfo : adInfos) {
if(taNativeInfo != null){
taNativeInfo.destroy();
}
}
adInfos.clear();
if (nativeView != null){
nativeView.destroy();
}
if (nativeAd != null) {
nativeAd.destroy();
}
}
当一个广告使用完后,下次不再使用即可销毁,调用mNativeInfo.release()
。
2.3.3.9 其它API
adNativeInfo.isOfflineAd();
说明:⽤来判断填充的广告是属于离线还是在线广告,1:离线广告 0:在线广告
nativeAd.setBidding(true) //设置为竞价模式
nativeAd.loadAd()//发起广告请求,返回价格信息
nativeAd.loadAd(BidInfo bidInfo) //获取价格信息后,通过价格信息下载广告素材
说明:SDK2.0.1.1+版本新增了HeaderBidding功能,增加了以上两个API。
2.3.4 开屏广告
简介
出现在自然端点和过渡段的广告样式,支持的广告尺寸9:16、1:2、2:3,效果如图:
9:16 | 1:2 | 2:3 |
---|---|---|
![]() | ![]() | ![]() |
接入步骤
splash支持以View和Activity(SDK2.2.0.1+支持)两种形式展示广告,媒体可根据自己的需求进行选择。
2.3.4.1 添加TSplashView
首先在要展示开屏广告的布局文件中加入TSplashView(View形式展示广告需要) 如下:
<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.cloud.hisavana.sdk.api.adx.TSplashView
android:id="@id/splash_ad"
app:layout_constraintTop_toTopOf="parent"
android:layout_width="match_parent"
android:layout_height="0dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
2.3.4.2 初始化开屏广告对象
View形式展示广告
TSplashView splashView = findViewById(R.id.splash_ad);
splashView.setPlacementId(placementId);
Activity形式展示广告
TSplash tSplash = new TSplash(context,"placementId");
2.3.4.3 设置广告状态监听
View形式展示广告
splashView.setListener(new AdListener() {
@Override
public void onError(TaErrorCode adError) {
Log.d(TAG,"Ad request failed");
}
@Override
public void onAdLoaded() {
Log.d(TAG,"Ad request successful");
}
@Override
public void onAdClicked(DownUpPointBean pointBean) {
Log.d(TAG,"Ad click callback");
}
@Override
public void onAdShow() {
Log.d(TAG,"Ad show callback");
}
@Override
public void onTimeOut() {
Log.d(TAG,"Ad request timeout");
}
@Override
public void onBiddingSuccess(BidInfo bidInfo) {
//New in version 2.0.1.1+
Log.d(TAG,"Ad bidding successful");
}
@Override
public void onBiddingFailed(TaErrorCode adError) {
//New in version 2.0.1.1+
Log.d(TAG,"Ad bidding failed");
}
@Override
public void onAdClosed() {
Log.d(TAG,"Ad close callback");
}
});
Activity形式展示广告
tSplash.setListener(new AdListener)
2.3.4.4 设置跳过监听
View形式展示广告
splashView.setSkipListener(new OnSkipListener() {
@Override
public void onClick() {
Log.d(TAG,"setSkipListener onClick");
}
@Override
public void onTimeEnd() {
Log.d(TAG,"setSkipListener onTimeEnd");
}
});
关于点击开屏广告后跳转首页的处理方式:需要开发者在启动页中onClicked()
回调中记录点击状态isClicked = true
,在onResume()
方法中做跳转主页面、移除开屏view的逻辑处理。
…
@Override
public void onClicked() {
isClicked = true;
}
@Override
protected void onResume() {
super.onResume();
if (isClicked){
//跳转首页
guideToMain();
//移除开屏view
if (splashView!= null && splashView.getParent() != null){
((ViewGroup) splashView.getParent()).removeView(splashView);
}
}
}
…
Activity形式展示广告
tSplash.setSkipListener(new OnSkipListener())
2.3.4.5 请求广告
View形式展示广告
splashView.loadAd();
Activity形式展示广告
tSplash.loadAd();
2.3.4.6 展示广告
View形式展示广告
tSplasplashView.setLogoLayout(logoView);//添加logo
splashView.show();
Activity形式展示广告
tSplash.setLogoLayout(logoView);//添加logo
tSplash.show();
2.3.4.7 关闭广告
@Override
public void onAdClosed() {
//sdk2.1.0.0+版本新增,在触发关闭后可调用splashView.destroy()关闭广告
if(splashView != null){
splashView.destroy();
}
//activity形式展示广告时,使用以下api
if(tSplash != null){
tSplash.destroy();
tSplash = null;
}
}
2.3.4.8 销毁广告
View形式展示广告
@Override
protected void onDestroy() {
super.onDestroy();
if (splashView != null) {
splashView.destroy();
splashView = null;
}
}
Activity形式展示广告
tSplash.destroy();
2.3.4.9 其它API
tSplash.getFillAdType();
说明:⽤来判断填充的广告是属于离线还是在线广告,1:离线广告 0:在线广告 -1:无填充。
tSplash.setBidding(true) //设置为竞价模式
tSplash.loadAd()//发起广告请求,返回价格信息
tSplash.loadAd(BidInfo bidInfo) //获取价格信息后,通过价格信息下载广告素材
说明:SDK2.0.1.1+版本新增了HeaderBidding功能,增加了以上两个API。