TogetherAd 封装了多种广告的 SDK,可以自行控制请求各种广告次数的比例
文章最后又项目源代码链接
百度Mob、腾讯GDT、科大讯飞
多种平台随机展示
因为各个平台分发广告的量实际上有可能不够用,所以多种广告根据一定比例随机展示会使收益最大化
控制个平台广告的展示比例
因为各个平台分发广告的量是不一样的,比如广点通分配1000次,百度只有100次,那么展示广点通和百度广告的次数必然是10:1才能使收益最大化
广告失败切换
如果某个平台的广告请求失败或没有量,会自动在其他广告中随机出一种再次请求,这样可以尽可能多的展示广告,使收益最大化
第一种: Gradle 集成
项目根目录下 build.gradle 中
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Module 目录下 build.gradle 中
dependencies {
implementation 'com.github.ifmvo:TogetherAd:lastest_version'
}
第二种: 本地导入 aar 集成
点击下载 TogetherAd-1.1.4.aar 文件后,放入 Module 目录下的 libs 文件夹中
Module 目录下 build.gradle 中
dependencies {
implementation(name: 'TogetherAd-1.1.4', ext: 'aar')
}
public class TogetherAdConst {
//开屏
public static final String AD_SPLASH = "ad_splash";
//插屏
public static final String AD_TIEPIAN_LIVE = "ad_flow_tiepian_live";
//首页信息流
public static final String AD_FLOW_INDEX = "ad_flow_index";
//直播播放器前贴
public static final String AD_INTER = "ad_inter";
......
}
自定义的广告位用于初始化广告位ID,也被当做请求广告时的参数
//初始化百度Mob广告
Map baiduIdMap = new HashMap<>();
baiduIdMap.put(TogetherAdConst.AD_SPLASH, "相应的广告位ID");
baiduIdMap.put(TogetherAdConst.AD_INTER, "xxxxxx");
baiduIdMap.put(TogetherAdConst.AD_FLOW_INDEX, "xxxxxx");
baiduIdMap.put(TogetherAdConst.AD_VIDEO_PRE, "xxxxxx");
TogetherAd.INSTANCE.initBaiduAd(getApplicationContext(), "你的Baidu_MobAds的APPID", baiduIdMap);
//初始化腾讯广点通广告
Map gdtIdMap = new HashMap<>();
gdtIdMap.put(TogetherAdConst.AD_SPLASH, "相应的广告位ID");
gdtIdMap.put(TogetherAdConst.AD_INTER, "xxxxxxxxxxxx");
gdtIdMap.put(TogetherAdConst.AD_FLOW_INDEX, "xxxxxxxxxxxx");
gdtIdMap.put(TogetherAdConst.AD_VIDEO_PRE, "xxxxxxxxxxxx");
TogetherAd.INSTANCE.initGDTAd(getApplicationContext(), "你的GDT的APPID", gdtIdMap);
//初始化科大讯飞广告
Map iFlyIdMap = new HashMap<>();
iFlyIdMap.put(TogetherAdConst.AD_SPLASH, "相应的广告位ID");
iFlyIdMap.put(TogetherAdConst.AD_INTER, "xxxxxxxxxxxx");
iFlyIdMap.put(TogetherAdConst.AD_FLOW_INDEX, "xxxxxxxxxxxx");
iFlyIdMap.put(TogetherAdConst.AD_VIDEO_PRE, "xxxxxxxxxxxx");
TogetherAd.INSTANCE.initXunFeiAd(getApplicationContext(), iFlyIdMap);
/**
* mContext 上下文
* splashConfigStr: 各平台的展示比例,会根据这个比例随机请求某个平台的广告,比例越大展示的概率就越大
* 例如: "baidu:1,gdt:1,xunfei:1" (baidu、gdt、xunfei 等key区分大小写)
* adConstStr: 广告位 例如:TogetherAdConst.AD_SPLASH
* adsParentLayout: 展示开屏广告的容器 ( 广告平台要求:容器大小不低于屏幕的75% )
* adListener: 监听器广告状态回调
*/
TogetherAdSplash.INSTANCE.showAdFull(mContext, splashConfigStr, adConstStr, adsParentLayout, new TogetherAdSplash.AdListenerSplashFull() {
@Override
public void onStartRequest(@NotNull String s) {
//开始请求广告之前,channel:gdt、baidu、xunfei
}
@Override
public void onAdClick(@NotNull String s) {
//广告被点击之后,channel:gdt、baidu、xunfei
}
@Override
public void onAdFailed(@Nullable String s) {
//广告加载失败
}
@Override
public void onAdDismissed() {
//广告倒计时结束
}
@Override
public void onAdPrepared(@NotNull String s) {
//广告请求成功,准备展示,channel:gdt、baidu、xunfei
}
});
/**
* 信息流广告会随机返回其中一种平台的广告集合,一般用于列表中广告的展示
* mContext 上下文
* listConfigStr: 各平台的展示比例,会根据这个比例随机请求某个平台的广告,比例越大展示的概率就越大
* 例如: "baidu:1,gdt:1,xunfei:1" (baidu、gdt、xunfei 等key区分大小写)
* adConstStr: 广告位 例如:TogetherAdConst.AD_FLOW_INDEX
* adListener: 监听器广告状态回调
*/
TogetherAdFlow.INSTANCE.getAdList(mContext, "baidu:1,gdt:1,xunfei:1", adConstStr, new TogetherAdFlow.AdListenerList() {
@Override
public void onAdFailed(@Nullable String s) {
//广告加载失败
}
@Override
public void onAdLoaded(@NotNull String s, @NotNull List> list) {
//广告请求成功,准备展示
//channel:gdt、baidu、xunfei
//adList:某个平台的广告List,list里面的object:NativeMediaADData 是广点通,NativeResponse 是百度,NativeADDataRef 是科大讯飞
//可以通过多类型列表进行展示,详细可借鉴 Demo 中的 IndexFragment
}
@Override
public void onStartRequest(@NotNull String s) {
//开始请求广告之前,channel:gdt、baidu、xunfei
}
// onClick 点击事件需要自行根据各平台的文档处理
});
TogetherAdPreMovie.INSTANCE.showAdPreMovie(this, "baidu:1,gdt:1,xunfei:1", TogetherAdConst.AD_TIEPIAN_LIVE, adsParentLayout, new TogetherAdPreMovie.AdListenerPreMovie() {
@Override
public void onAdClick(@NotNull String s) {
//广告被点击之后,channel:gdt、baidu、xunfei
}
@Override
public void onAdFailed(@Nullable String s) {
//广告加载失败
}
@Override
public void onAdDismissed() {
//广告倒计时结束
}
@Override
public void onAdPrepared(@NotNull String s) {
//广告请求成功,准备展示,channel:gdt、baidu、xunfei
}
@Override
public void onStartRequest(@NotNull String s) {
//开始请求广告之前,channel:gdt、baidu、xunfei
}
});
TogetherAdInter.INSTANCE.showAdInter(this, Config.interAdConfig(), TogetherAdConst.AD_INTER, false, mRlInterAd, new TogetherAdInter.AdListenerInter() {
@Override
public void onStartRequest(@NotNull String s) {
//开始请求广告之前,channel:gdt、baidu、xunfei
}
@Override
public void onAdClick(@NotNull String s) {
//广告被点击之后,channel:gdt、baidu、xunfei
}
@Override
public void onAdFailed(@Nullable String s) {
//广告加载失败
}
@Override
public void onAdDismissed() {
//广告倒计时结束
}
@Override
public void onAdPrepared(@NotNull String s) {
//广告请求成功,准备展示,channel:gdt、baidu、xunfei
}
});
class TogetherAdConst {
companion object {
//开屏
const val AD_SPLASH = "ad_splash"
//插屏
const val AD_INTER = "ad_inter"
//首页信息流
const val AD_FLOW_INDEX = "ad_flow_index"
//视频播放前贴
const val AD_VIDEO_PRE = "ad_video_pre"
//xxxxxxxx
const val XXX_XXX_XXX = "xxx_xxx_xxx"
......
}
}
自定义的广告位用于初始化广告位ID,也被当做请求广告时的参数
//初始化百度Mob广告
val baiduIdMap = mutableMapOf(
TogetherAdConst.AD_SPLASH to "2543740",
TogetherAdConst.AD_INTER to "2543741",
TogetherAdConst.AD_FLOW_INDEX to "2715031",
TogetherAdConst.AD_TIEPIAN_LIVE to "5985131"
)
TogetherAd.initBaiduAd(applicationContext, "ee93e58e", baiduIdMap)
//初始化腾讯广点通广告
val gdtIdMap = mutableMapOf(
TogetherAdConst.AD_SPLASH to "8030228893573270",
TogetherAdConst.AD_INTER to "4090620883979242",
TogetherAdConst.AD_FLOW_INDEX to "4010231735332811",
TogetherAdConst.AD_TIEPIAN_LIVE to "4060449650093530"
)
TogetherAd.initGDTAd(applicationContext, "1106572734", gdtIdMap)
//初始化科大讯飞广告
val xunFeiIdMap = mutableMapOf(
TogetherAdConst.AD_SPLASH to "FD0AC8FDE5CE0B317A6C4077E68D34CC",
TogetherAdConst.AD_INTER to "6FD44C667D5EFD97730CC1E3F174D965",
TogetherAdConst.AD_FLOW_INDEX to "EE2009111A1DF0BCA9DAD3723A95602F",
TogetherAdConst.AD_TIEPIAN_LIVE to "93D157AAFA8B7EF64165B1F0ECEE2623"
)
TogetherAd.initXunFeiAd(applicationContext, xunFeiIdMap)
/**
* mContext 上下文
* splashConfigStr: 各平台的展示比例,会根据这个比例随机请求某个平台的广告,比例越大展示的概率就越大
* 例如: "baidu:1,gdt:1,xunfei:1" (baidu、gdt、xunfei 等key区分大小写)
* adConstStr: 广告位 例如:TogetherAdConst.AD_SPLASH
* adsParentLayout: 展示开屏广告的容器 ( 广告平台要求:容器大小不低于屏幕的75% )
* adListener: 监听器广告状态回调
*/
TogetherAdSplash.showAdFull(mContext, splashConfigStr, adConstStr, adsParentLayout, object : TogetherAdSplash.AdListenerSplashFull {
override fun onStartRequest(channel: String) {
//开始请求广告之前,channel:gdt、baidu、xunfei
}
override fun onAdClick(channel: String) {
//广告被点击之后,channel:gdt、baidu、xunfei
}
override fun onAdFailed(failedMsg: String?) {
//广告加载失败
}
override fun onAdDismissed() {
//广告倒计时结束
}
override fun onAdPrepared(channel: String) {
//广告请求成功,准备展示,channel:gdt、baidu、xunfei
}
})
/**
* 信息流广告会随机返回其中一种平台的广告集合,一般用于列表中广告的展示
* mContext 上下文
* listConfigStr: 各平台的展示比例,会根据这个比例随机请求某个平台的广告,比例越大展示的概率就越大
* 例如: "baidu:1,gdt:1,xunfei:1" (baidu、gdt、xunfei 等key区分大小写)
* adConstStr: 广告位 例如:TogetherAdConst.AD_FLOW_INDEX
* adListener: 监听器广告状态回调
*/
TogetherAdFlow.getAdList(mContext, "baidu:1,gdt:1,xunfei:1", adConstStr, object : TogetherAdFlow.AdListenerList {
override fun onAdFailed(failedMsg: String?) {
//广告加载失败
}
override fun onAdLoaded(channel: String, adList: List<*>) {
//广告请求成功,准备展示
//channel:gdt、baidu、xunfei
//adList:某个平台的广告List,list里面的object:NativeMediaADData 是广点通,NativeResponse 是百度,NativeADDataRef 是科大讯飞
//可以通过多类型列表进行展示,详细可借鉴 Demo 中的 IndexFragment
}
override fun onStartRequest(channel: String) {
//开始请求广告之前,channel:gdt、baidu、xunfei
}
// onClick 点击事件需要自行根据各平台的文档处理
})
TogetherAdPreMovie.showAdPreMovie(this, "baidu:1,gdt:1,xunfei:1", TogetherAdConst.AD_TIEPIAN_LIVE, adsParentLayout, object : TogetherAdPreMovie.AdListenerPreMovie {
override fun onAdClick(channel: String) {
//广告被点击之后,channel:gdt、baidu、xunfei
}
override fun onAdFailed(failedMsg: String?) {
//广告加载失败
}
override fun onAdDismissed() {
//广告倒计时结束
}
override fun onAdPrepared(channel: String) {
//广告请求成功,准备展示,channel:gdt、baidu、xunfei
}
override fun onStartRequest(channel: String) {
//开始请求广告之前,channel:gdt、baidu、xunfei
}
})
TogetherAdInter.showAdInter(this, Config.interAdConfig(), TogetherAdConst.AD_INTER, false, mRlInterAd, object : TogetherAdInter.AdListenerInter {
override fun onStartRequest(channel: String) {
//开始请求广告之前,channel:gdt、baidu、xunfei
}
override fun onAdClick(channel: String) {
//广告被点击之后,channel:gdt、baidu、xunfei
}
override fun onAdFailed(failedMsg: String?) {
//广告加载失败
}
override fun onAdDismissed() {
//广告倒计时结束
}
override fun onAdPrepared(channel: String) {
//广告请求成功,准备展示,channel:gdt、baidu、xunfei
}
})
假如有 BAIDU,GDT,ADVIEW 这三种广告,实际的配置字符串应该是这样的:“baidu:3,gdt:3,adview:4”
随机广告配置必须符合这样的格式
“xxx:m,yyy:n,zzz:i”
AdRandomUtil 这个类只会识别特定的 key ( 例:baidu、gdt、adview )
“baidu:2,gdt:8” <==> “baidu:2,gdt:8,abc:3” ( abc 会被忽略 )
key 区分大小写
“BAIDU:2,GDT:8” ≠ “baidu:2,gdt:8”
“Baidu:2,Gdt:8” ≠ “baidu:2,gdt:8”
假如有 BAIDU,GDT,ADVIEW 这三种广告 ( 实际的配置字符串:“baidu:3,gdt:3,adview:4” )
第一次随机到了 GDT,如果 GDT 请求失败,将 GDT 的 key 使用一个通用的字符串替换,再从其他的广告中再随机
此时的配置字符串:“baidu:3,HIDE:3,adview:4”
第二次随机到了 BAIDU,如果 BAIDU 也请求失败了,将 BAIDU 的 key 使用一个通用的字符串替换,再从其他的广告中再随机
此时的配置字符串:“HIDE:3,HIDE:3,adview:4”
…
直到请求某个广告成功后停止
如果所有的广告全部失败,此时的配置字符串:“HIDE:3,HIDE:3,HIDE:4”
可以到 TogetherAd 的 Github 提交Issues ,或添加 TogetherAd 交流群 : 688291767