此文档主要介绍如何自定义Adapter集成Client Bidding,更多自定义Adapter实现请参考此文档 自定义广告平台
Client Bidding加载流程如图:
public class CustomSDKInterstitialAdapter extends CustomInterstitialAdapter {
...
}
抽象方法 | 参数说明 | 返回值 | 作用 | 说明 |
---|---|---|---|---|
startBiddingRequest | Context applicationContext: 上下文 Map | boolean | 发起Client Bidding竞价请求,并通过biddingListener返回竞价结果 | 在此方法中发起头部竞价的请求,并将竞价结果通过biddingListener的onC2SBiddingResultWithCache(ATBiddingResult bidResult,BaseAd baseAd)方法通知Taku SDK 注意:此方法必需返回ture; |
//自定义广告平台的广告位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;
}
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此广告源竞价失败 |
...
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);
}
}
});
}
抽象方法 | 参数说明 | 返回值 | 作用 | 说明 |
---|---|---|---|---|
isAdReady | - | boolean | 用于判断自定义广告平台的插屏广告是否已经是准备完成的状态 | 用于判断广告是否已经是准备完成的状态 |
...
CustomInterstitialAd customInterstitialAd;
@Override
public boolean isAdReady() {
if (customInterstitialAd != null) {
return customInterstitialAd.isReady();
}
return false;
}
抽象方法 | 参数说明 | 返回值 | 作用 | 说明 |
---|---|---|---|---|
show | 根据广告形式而定 | void | 实现展示自定义广告平台广告逻辑 | 实现展示广告逻辑 |
...
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接口,重写相关方法,以实现向自定义广告平台通知竞胜或者竞败的事件
public class CustomSDKBiddingNotice implements ATBiddingNotice {
//自定义广告平台的广告对象
CustomInterstitialAd customInterstitialAd;
protected GDTATBiddingNotice(CustomInterstitialAd customInterstitialAd) {
this.customInterstitialAd = customInterstitialAd;
}
}
抽象方法 | 参数说明 | 返回值 | 作用 | 是否必须实现 | 说明 |
---|---|---|---|---|---|
notifyBidWin | double costPrice:竞胜价格 double secondPrice: 第一位竞败的价格 Map Map | void | 实现通知自定义广告平台的广告竞胜 | 是 | 本广告竞价成功时,会触发此方法 costPrice参数:竞胜方价格 secondPrice参数:竞胜方后一位的价格(二价) 注意:价格的货币单位为开发者调用ATBiddingResult.success()方法传入的ATAdConst.CURRENCY |
@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;
}
抽象方法 | 参数说明 | 返回值 | 作用 | 是否必须实现 | 说明 |
---|---|---|---|---|---|
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 | 输给了 其他广告平台 |
@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;
}
抽象方法 | 参数说明 | 返回值 | 作用 | 是否必须实现 | 说明 |
---|---|---|---|---|---|
notifyBidDisplay | boolean isWinner:是否为竞胜方 double displayPrice:正在曝光的广告的价格 | void | 实现通知自定义广告平台的广告,当前有广告曝光 | 是 | 当前有广告曝光时,会触发此方法 isWinner参数:当前曝光的广告是否为竞胜方 displayPrice:当前曝光的广告的价格 注意:价格的货币单位为开发者调用ATBiddingResult.success()方法传入的ATAdConst.CURRENCY |