此文档主要介绍如何自定义Adapter集成Client Bidding,更多自定义Adapter实现请参考此文档 自定义广告平台
Client Bidding加载流程如图:
1. 继承自定义Adapter类
- 以插屏广告为例,开发者需继承CustomInterstitialAdapter以实现Client Bidding功能、
1.1 示例代码
public class CustomSDKInterstitialAdapter extends CustomInterstitialAdapter {
...
}
2. 发起竞价
- 开发者调用 ATInterstitialAd 的 load() API时,会调用到自定义Adapter的startBiddingRequest()方法
- 开发者需重写startBiddingRequest(),在此方法中,调用自定义广告平台的API发起广告竞价
2.1 API说明
| 抽象方法 |
参数说明 |
返回值 |
作用 |
说明 |
| startBiddingRequest |
Context applicationContext: 上下文 Map |
boolean |
发起Client Bidding竞价请求,并通过biddingListener返回竞价结果 |
在此方法中发起头部竞价的请求,并将竞价结果通过**biddingListener的onC2SBiddingResultWithCache(ATBiddingResult bidResult,BaseAd baseAd)**方法通知Taku SDK 注意:此方法必需返回ture; |
2.2 示例代码
//自定义广告平台的广告位ID
String placementId;
@Override
public boolean startBiddingRequest(final Context context, Map serverExtra, Map localExtra, final ATBiddingListener biddingListener) {
//从serverExtra中获取后台配置的自定义平台的广告位ID
placementId = (String) serverExtra.get("unit_id");
CustomSDKInitManager.getInstance().initSDK(context, serverExtra, new MediationInitCallback() {
@Override
public void onSuccess() {
//广告平台初始化成功后发起竞价请求
startBid(context, biddingListener);
}
@Override
public void onFail(String errorMsg) {
//通过ATBiddingListener,回调竞价失败
if (biddingListener != null) {
biddingListener.onC2SBiddingResultWithCache(ATBiddingResult.fail(errorMsg), null);
}
}
});
//必须return true
return true;
}
3. 通知Taku SDK竞价结果
- 广告加载成功:调用广告平台的API获取返回的价格、货币单位等,并通过ATBiddingListener调用onC2SBiddingResultWithCache()方法,通知Taku SDK竞价成功
- 广告加载失败:需通过ATBiddingListener调用onC2SBiddingResultWithCache()方法,通知Taku SDK竞价失败的错误信息
3.1 API说明
ATBiddingListener 竞价结果回调说明
| 回调方法 |
参数说明 |
说明 |
| onC2SBiddingResultWithCache |
(ATBiddingResult biddingResult, BaseAd baseAd) |
广告竞价结束后返回竞价结果给Taku biddingResult:竞价成功或者失败,参考下方ATBiddingResult说明 baseAd:竞价成功时,原生广告需返回CustomNativeAd提供素材信息(请参考原生广告说明 返回此对象) 其他广告形式返回null即可 竞价失败时,返回null即可 |
ATBiddingResult 竞价结果方法说明
| 方法 |
参数说明 |
返回值 |
作用 |
| success |
double price:本次出价价格 String cacheId:本次竞价广告缓存ID ATBiddingNotice biddingNotice:广告竞价相关事件管理类,可传null,具体可参考此文档附录部分 ATAdConst.CURRENCY currency:价格货币单位,支持RMB(人民币元),RMB_CENT(人民币分),USD(美元) |
ATBiddingResult |
返回竞价成功结果,并把竞价相关信息传递给Taku |
| success |
double sortPrice:本次广告的排序价格 其他参数意义同上 |
ATBiddingResult |
作用同上 注意:sortPrice会影响该广告在Taku内部Waterfall中的排序,sortPrice越大,该广告越可能被优先使用。如无特殊需要,请使用上面的方法 |
| fail |
String errorMsg:竞价失败描述 |
ATBiddingResult |
返回竞价失败结果,通知Taku此广告源竞价失败 |
3.2 示例代码
...
CustomInterstitialAd customInterstitialAd;
private void startBid(Context context, final ATBiddingListener biddingListener) {
customInterstitialAd = new CustomInterstitialAd(placementId);
customInterstitialAd.load(placementId, new CustomAdLoadListener() {
@Override
public void onLoadSuccess() {
//获取价格
double bidPrice = customInterstitialAd.getBidPrice();
//获取货币单位
ATAdConst.CURRENCY currency = ATAdConst.CURRENCY.USD;
if (customInterstitialAd.getCurrency() == "RMB") {
currency = ATAdConst.CURRENCY.RMB;
}
//用于标识此次竞价的唯一ID,可使用UUID或者时间戳
String token = UUID.randomUUID().toString();
//广告竞价相关事件管理类,可传null
ATBiddingNotice biddingNotice = new CustomSDKBiddingNotice(customInterstitialAd);
//原生广告需要返回BaseAd,其他广告形式可传null
BaseAd basead = null;
//通知Taku SDK竞价结果
if (biddingListener != null) {
biddingListener.onC2SBiddingResultWithCache(
ATBiddingResult.success(bidPrice, token, biddingNotice, currency), basead
);
}
}
@Override
public void onLoadFailed(String errorMsg) {
//通知Taku SDK竞价结果
if (biddingListener != null) {
biddingListener.onC2SBiddingResultWithCache(ATBiddingResult.fail(errorMsg), null);
}
}
});
}
4. 判断广告是否准备好
- 开发者调用 ATInterstitialAd 的 isAdReady() API时,会调用到自定义Adapter的isAdReady()方法
- 开发者需重写isAdReady()方法,在此方法中,调用自定义广告平台的API,返回广告的状态
4.1 API说明
| 抽象方法 |
参数说明 |
返回值 |
作用 |
说明 |
| isAdReady |
- |
boolean |
用于判断自定义广告平台的插屏广告是否已经是准备完成的状态 |
用于判断广告是否已经是准备完成的状态 |
4.2 示例代码
...
CustomInterstitialAd customInterstitialAd;
@Override
public boolean isAdReady() {
if (customInterstitialAd != null) {
return customInterstitialAd.isReady();
}
return false;
}
5. 展示广告
- 开发者调用 ATInterstitialAd 的 show() API时,会依次调用到自定义Adapter的isAdReady(),show()方法
- 开发者需重写show()方法,在此方法中,调用自定义广告平台的API,展示自定义广告,通过CustomInterstitialEventListener通知Taku SDK,广告曝光、点击、关闭等事件
5.1 API说明
| 抽象方法 |
参数说明 |
返回值 |
作用 |
说明 |
| show |
根据广告形式而定 |
void |
实现展示自定义广告平台广告逻辑 |
实现展示广告逻辑 |
5.2 示例代码
...
CustomInterstitialAd customInterstitialAd;
@Override
public void show(Activity activity) {
if (customInterstitialAd != null) {
customInterstitialAd.setEventListener(new CustomAdEventListener() {
@Override
public void onAdImpression() {
//通知Taku SDK,广告曝光成功
if (mImpressListener != null) {
mImpressListener.onInterstitialAdShow();
}
}
@Override
public void onADClicked() {
//通知Taku SDK,广告点击了
if (mImpressListener != null) {
mImpressListener.onInterstitialAdClicked();
}
}
@Override
public void onADClicked() {
//通知Taku SDK,广告关闭了
if (mImpressListener != null) {
mImpressListener.onInterstitialAdClose();
}
}
});
//触发广告展示
customInterstitialAd.show(activity);
}
}
附录 实现ATBiddingNotice通知自定义平台竞价结果
通过实现ATBiddingNotice接口,重写相关方法,以实现向自定义广告平台通知竞胜或者竞败的事件
1. 实现ATBiddingNotice
- 以插屏广告为例,开发者可选择实现ATBiddingNotice接口,向自定义广告平台通知竞价结果事件(具体发送时机由Taku SDK决定)
1.1 示例代码
public class CustomSDKBiddingNotice implements ATBiddingNotice {
//自定义广告平台的广告对象
CustomInterstitialAd customInterstitialAd;
protected GDTATBiddingNotice(CustomInterstitialAd customInterstitialAd) {
this.customInterstitialAd = customInterstitialAd;
}
}
2. 通知竞胜
- 当此平台广告为此次加载中最高价时,触发notifyBidWin()方法
- 开发者需重写`notifyBidWin()方法,在此方法中,调用自定义广告平台的API,通知广告平台竞胜了
2.1 API说明
| 抽象方法 |
参数说明 |
返回值 |
作用 |
是否必须实现 |
说明 |
| notifyBidWin |
double costPrice:竞胜价格 double secondPrice: 第一位竞败的价格 Map Map |
void |
实现通知自定义广告平台的广告竞胜 |
是 |
本广告竞价成功时,会触发此方法 costPrice参数:竞胜方价格 secondPrice参数:竞胜方后一位的价格(二价) 注意:价格的货币单位为开发者调用ATBiddingResult.success()方法传入的ATAdConst.CURRENCY |
2.2 示例代码
@Override
public void notifyBidWin(double costPrice, double secondPrice, Map extra) {
Map map = new HashMap<>();
map.put(CustomSDK.COST_PRICE, costPrice);
map.put(CustomSDK.HIGHEST_LOSS_PRICE, secondPrice);
//通知竞胜
customInterstitialAd.sendWinNotification(map);
customInterstitialAd = null;
}
3. 通知竞败
- 当此平台广告因缓存过期等原因,Taku认为竞败时,触发notifyBidLoss()方法
- 开发者需重写`notifyBidLoss()方法,在此方法中,调用自定义广告平台的API,通知广告平台竞败了
3.1 API说明
| 抽象方法 |
参数说明 |
返回值 |
作用 |
是否必须实现 |
说明 |
| notifyBidLoss |
String lossCode:竞败码 double winPrice: 竞胜价格 Map Map |
void |
实现通知自定义广告平台的广告竞败 |
是 |
本广告竞价失败时,会触发此方法 lossCode参数:失败原因,参考ATAdConst.BIDDING_TYPE类,见下方说明 extra参数:可通过Key: ATBiddingNotice.ADN_ID,从extra中获取竞胜方渠道,竞胜方渠道的枚举值,参考ATAdConst.BIDDING_ADN_ID类,见下方说明 注意:价格的货币单位为开发者调用ATBiddingResult.success()方法传入的ATAdConst.CURRENCY |
ATAdConst.BIDDING_TYPE:竞败原因
| 枚举 |
说明 |
| BIDDING_LOSS_WITH_LOW_PRICE_IN_NORMAL |
比普通常规广告的价格低 |
| BIDDING_LOSS_WITH_LOW_PRICE_IN_HB |
比竞价广告的价格低 |
| BIDDING_LOSS_WITH_BIDDING_TIMEOUT |
竞价超时,如因长时间无竞价结果通知Taku SDK |
| BIDDING_LOSS_WITH_EXPIRE |
广告缓存过期 |
ATAdConst.BIDDING_ADN_ID:竞胜方渠道
| 枚举 |
说明 |
| LOSE_TO_NORMAL_IN_SAME_ADN |
输给了 同个广告平台的普通常规广告 |
| LOSE_TO_HB_IN_SAME_ADN |
输给了 同个广告平台的竞价广告 |
| LOSE_TO_OWN_ADN |
输给了 自有广告(直投广告、交叉推广) |
| LOSE_TO_OTHER_ADN |
输给了 其他广告平台 |
3.2 示例代码
@Override
public void notifyBidLoss(String lossCode, double winPrice, Map extra) {
//判断竞败原因
int lossReason = CustomSDKLossReason.OTHER;
switch (lossCode) {
case ATAdConst.BIDDING_TYPE.BIDDING_LOSS_WITH_BIDDING_TIMEOUT:
lossReason = CustomSDKLossReason.NO_AD;
break;
case ATAdConst.BIDDING_TYPE.BIDDING_LOSS_WITH_LOW_PRICE_IN_HB:
case ATAdConst.BIDDING_TYPE.BIDDING_LOSS_WITH_LOW_PRICE_IN_NORMAL:
lossReason = CustomSDKLossReason.LOW_PRICE;
break;
}
//判断竞胜方渠道
int adnId = ATInitMediation.getIntFromMap(extra, ATBiddingNotice.ADN_ID, -1);
switch (adnId) {
case ATAdConst.BIDDING_ADN_ID.LOSE_TO_NORMAL_IN_SAME_ADN:
adnId = CustomSDKADNID.NORMAL;
break;
case ATAdConst.BIDDING_ADN_ID.LOSE_TO_HB_IN_SAME_ADN:
adnId = CustomSDKADNID.HB;
break;
case ATAdConst.BIDDING_ADN_ID.LOSE_TO_OWN_ADN:
adnId = CustomSDKADNID.OWN_AD;
break;
case ATAdConst.BIDDING_ADN_ID.LOSE_TO_OTHER_ADN:
adnId = CustomSDKADNID.OTHER;
break;
}
Map map = new HashMap<>();
map.put(CustomSDK.WIN_PRICE, winPrice);
map.put(CustomSDK.LOSS_REASON, lossReason);
map.put(CustomSDK.ADN_ID, adnId);
//通知竞败
customInterstitialAd.sendLossNotification(map);
customInterstitialAd = null;
}
4. 其他API说明
| 抽象方法 |
参数说明 |
返回值 |
作用 |
是否必须实现 |
说明 |
| notifyBidDisplay |
boolean isWinner:是否为竞胜方 double displayPrice:正在曝光的广告的价格 |
void |
实现通知自定义广告平台的广告,当前有广告曝光 |
是 |
当前有广告曝光时,会触发此方法 isWinner参数:当前曝光的广告是否为竞胜方 displayPrice:当前曝光的广告的价格 注意:价格的货币单位为开发者调用ATBiddingResult.success()方法传入的ATAdConst.CURRENCY |