自定义广告网络
1. 初始化 SDK
WMCustomAdapterProxy 是自定义广告网络初始化代理的基类,用于把“渠道 SDK 初始化结果”回传给 ToBid。开发者通常只需要继承该类,并实现必要的初始化与版本相关方法即可。
继承 WMCustomAdapterProxy,最少需要完成下面 4 件事:
- 实现
initializeADN(...):完成渠道 SDK 初始化 - 实现
getNetworkSdkVersion():返回当前渠道 SDK 版本号 - 实现
baseOnToBidCustomAdapterVersion():返回当前自定义适配器协议版本 - 在初始化前后调用以下回调:
callInitBefore(...)callInitSuccess()callInitFail(...)
public class MyCustomAdapterProxy extends WMCustomAdapterProxy {
@Override
public void initializeADN(Context context, Map<String, Object> serverExtra) {
// 1. 在这里初始化你的广告网络 SDK
// 2. 初始化前可先调用 callInitBefore(...) 通知 ToBid
callInitBefore(this);
try {
// TODO: 执行渠道 SDK 初始化
// 如果初始化成功:
callInitSuccess();
} catch (Exception e) {
// 如果初始化失败:
callInitFail(10001, e.getMessage());
}
}
@Override
public String getNetworkSdkVersion() {
// 返回渠道 SDK 版本号
return "1.0.0";
}
@Override
public void notifyPrivacyStatusChange() {
// 隐私状态变化时同步给渠道 SDK
}
@Override
public int baseOnToBidCustomAdapterVersion() {
// 返回当前适配器协议版本
return 1;
}
}1.1 API 说明
| 函数名称 | 参数列表 | 返回值类型(默认值说明) | 参数说明 | 备注 |
|---|---|---|---|---|
setInitListener(...) | int channelId, WMNetworkInitListener listener | void | channelId 用于标识当前渠道;listener 用于接收初始化前/成功/失败回调 | final 方法,不建议重写;内部会保存渠道 ID 和监听器 |
callInitBefore(...) | Object initInstance | void | 在真正初始化渠道 SDK 之前调用,通知 ToBid 已进入初始化前阶段 | 如果 APP 已设置监听器,会回调 onNetworkInitBefore(...) |
callInitSuccess() | 无 | void | 通知 ToBid:渠道 SDK 初始化成功 | 内部已做异常捕获;建议在 SDK 真正可用后再调用 |
callInitFail(...) | int code, String message | void | 通知 ToBid:渠道 SDK 初始化失败 | 内部已做异常捕获;建议尽量传入可定位的问题信息 |
getAdapterSdkVersion() | 无 | int,默认值 47000 | 自定义适配器版本号,用于标识适配器能力版本 | 非强制实现;当前基类默认返回 47000 |
baseOnToBidCustomAdapterVersion() | 无 | int | 返回基于 ToBid 自定义适配器接口的版本号 | 抽象方法,子类必须实现 |
getNetworkSdkVersion() | 无 | String | 返回当前广告网络 SDK 版本号 | 定义在接口中,子类必须实现 |
notifyPrivacyStatusChange() | 无 | void | 通知渠道 SDK 隐私状态变化 | 定义在接口中,子类必须实现 |
initializeADN(...) | Context context, Map<String, Object> serverExtra | void | 执行渠道 SDK 初始化 | 定义在接口中,子类必须实现 |
onNetworkInitBefore(...) | int channel_id, Object initInstance | 初始化前回调 | 由 callInitBefore(...) 触发 | |
onNetworkInitSuccess(...) | int channel_id | 初始化成功回调 | 由 callInitSuccess() 触发 | |
onNetworkInitFailed(...) | int channel_id, int error_code, String error_msg | 初始化失败回调 | 由 callInitFail(...) 触发 |
1.2 注意事项
setInitListener(...)必须先于初始化调用- 否则
callInitBefore()、callInitSuccess()、callInitFail()将无法回传给 ToBid。
- 否则
初始化成功/失败只能有一个最终结果
- 初始化流程中请避免重复调用
callInitSuccess()或callInitFail()。
- 初始化流程中请避免重复调用
callInitBefore(...)应在真正初始化前调用- 这样 ToBid 才能正确感知当前渠道进入初始化阶段。
getNetworkSdkVersion()不要返回空值- 建议返回明确的版本号字符串,便于排查问题与版本兼容。
baseOnToBidCustomAdapterVersion()必须实现- 这是自定义适配器协议版本标识,ToBid 会据此做兼容判断。
callInitFail(...)的错误码和错误信息应尽量明确- 方便定位渠道 SDK 初始化失败原因。
回调内部已做异常捕获,但业务初始化代码仍需自行保护
- 初始化逻辑建议使用
try-catch包裹,避免异常影响主流程。
- 初始化逻辑建议使用
所有初始化相关调用建议在主线程规范下使用
- 避免在初始化链路中引入不必要的耗时操作。
2. 实现 Banner Adapter
WMCustomBannerAdapter 是横幅广告(Banner)场景下的自定义适配器基类,通常用于由第三方广告网络适配器继承实现。
它的主要职责是:
- 提供 Banner 广告 View 的统一出口
- 将第三方广告网络的加载、展示、点击、关闭等状态,统一回调给 WindMill SDK
- 简化 Banner 适配器的开发,让子类专注于对接具体广告网络
2.1 API 说明
| 函数名称 | 参数列表 | 返回值类型 | 参数说明 | 函数作用 |
|---|---|---|---|---|
getBannerView() | 无 | View | 无 | 抽象方法。由子类实现,返回 Banner 广告展示用的 View。 |
destroyAd() | 无 | void | 无 | 销毁广告相关引用,避免内存泄漏。 |
callLoadSuccess() | 无 | void | 无 | 通知 ToBid SDK:Banner 加载成功。 |
callLoadBiddingSuccess(...) | BidPrice price | void | price:竞价成功价格信息 | 通知 ToBid SDK:Banner 竞价加载成功,并上报竞价价格。 |
callLoadFail(...) | WMAdapterError adapterError | void | adapterError:加载失败原因 | 通知 ToBid SDK:Banner 加载失败。 |
callBannerAdShow() | 无 | void | 无 | 通知 ToBid SDK:Banner 已展示。 |
callBannerAdShowError(...) | WMAdapterError adapterError | void | adapterError:展示失败原因 | 通知 ToBid SDK:Banner 展示失败。 |
callBannerAdClick() | 无 | void | 无 | 通知 ToBid SDK:Banner 被点击。 |
callBannerAdClosed() | 无 | void | 无 | 通知 ToBid SDK:Banner 被关闭。 |
2.2 使用示例
下面是一个 Banner 自定义适配器的典型实现方式。
package com.example.ad;
import android.content.Context;
import android.view.View;
import com.windmill.sdk.base.WMAdapterError;
import com.windmill.sdk.custom.WMCustomBannerAdapter;
import com.windmill.sdk.models.BidPrice;
import java.util.Map;
public class MyBannerAdapter extends WMCustomBannerAdapter {
private View bannerView;
@Override
public View getBannerView() {
return bannerView;
}
@Override
public void loadAd(Context context, Map<String, Object> localExtra, Map<String, Object> serverExtra) {
try {
// 1. 创建第三方广告 View
bannerView = new View(context);
// 2. 模拟加载成功
callLoadSuccess();
// 3. 如果是竞价广告,也可以上报竞价成功
callLoadBiddingSuccess(new BidPrice("12.34"));
// 4. 模拟广告展示
callBannerAdShow();
} catch (Exception e) {
callLoadFail(new WMAdapterError(1001, "Banner load failed: " + e.getMessage()));
}
}
public void onBannerClicked() {
callBannerAdClick();
}
public void onBannerClosed() {
callBannerAdClosed();
}
public void onBannerShowError() {
callBannerAdShowError(new WMAdapterError(1002, "Banner show failed"));
}
@Override
public void destroyAd() {
super.destroyAd();
bannerView = null;
}
}2.3 注意事项
destroyAd()当前父类只释放了事件监听引用。如果子类持有第三方广告对象、View、Activity 引用等,也需要在子类中自行释放。callXXX()方法应在正确生命周期调用,建议在第三方 SDK 确认真实状态后再调用,例如:- 加载成功后再调用
callLoadSuccess() - 真正展示后再调用
callBannerAdShow() - 点击后再调用
callBannerAdClick() - 关闭后再调用
callBannerAdClosed()
- 加载成功后再调用
getBannerView()建议返回稳定的 View 实例。如果第三方 SDK 的 Banner View 会被宿主复用,建议确保:- 不要频繁重复创建
- 销毁后不要继续复用旧 View
- 与宿主页面生命周期一致
竞价场景需要正确上报价格。如果 Banner 是竞价模式,建议在加载完成后同步上报竞价结果,确保上层统计和竞价流程一致。
3. Reward Adapter
WMCustomRewardAdapter 是 激励视频广告(Reward Video) 场景下的自定义适配器基类,通常用于 第三方广告网络适配器继承实现。
它的主要作用是:
- 统一承接第三方广告网络的激励视频广告加载、展示、点击、关闭、播放完成、发奖等事件
- 将第三方 SDK 的状态回调转换为 WindMill SDK 可识别的事件
- 简化激励视频适配器开发,让子类专注于对接具体广告网络
3.1 API 说明
| 函数名称 | 参数列表 | 返回值类型 | 参数说明 | 函数作用 |
|---|---|---|---|---|
getRewardExtraOption() | 无 | Map<String, Object> | 无 | 返回激励视频相关的额外配置项;默认返回空 Map |
getRewardType() | 无 | int | 从 mediaExtraInfo 中读取奖励类型字段 | 获取激励视频类型;若未配置则默认返回 1 |
destroyAd() | 无 | void | 无 | 销毁广告并清空事件引用,减少资源泄漏 |
callLoadSuccess() | 无 | void | 无 | 通知上层:广告加载成功 |
callLoadBiddingSuccess(...) | BidPrice price: 竞价价格对象 | void | price:竞价成功价格信息 | 通知上层:广告竞价加载成功,并上报价格 |
callLoadFail(...) | WMAdapterError adapterError: 错误对象 | void | adapterError:加载失败原因 | 通知上层:广告加载失败 |
callVideoAdPlayError(...) | WMAdapterError adapterError: 错误对象 | void | adapterError:播放错误原因 | 通知上层:视频播放失败 |
callVideoAdShow() | 无 | void | 无 | 通知上层:视频广告已展示 |
callVideoAdClick() | 无 | void | 无 | 通知上层:视频广告被点击 |
callVideoAdDownload() | 无 | void | 无 | 通知上层:广告触发下载行为 |
callVideoAdClosed() | 无 | void | 无 | 通知上层:视频广告已关闭 |
callVideoAdPlayComplete() | 无 | void | 无 | 通知上层:视频播放完成 |
callVideoAdSkipped() | 无 | void | 无 | 通知上层:视频被跳过 |
callVideoAdReward(...) | boolean isReward: 是否发奖 | void | true 表示发奖,false 表示不发奖 | 通知上层:奖励发放结果 |
callVideoAdRewardWithData(...) | boolean isReward, Map<String, Object> customData | void | isReward: 是否发奖;customData: 自定义数据 | 通知上层:奖励结果,并携带自定义数据 |
3.2 使用示例
下面给出一个典型的激励视频适配器实现示例。
package com.example.ad;
import android.content.Context;
import com.windmill.sdk.base.WMAdapterError;
import com.windmill.sdk.custom.WMCustomRewardAdapter;
import com.windmill.sdk.models.BidPrice;
import java.util.HashMap;
import java.util.Map;
public class MyRewardAdapter extends WMCustomRewardAdapter {
private boolean loaded = false;
@Override
public void loadAd(Context context, Map<String, Object> localExtra, Map<String, Object> serverExtra) {
try {
// 这里执行第三方广告网络的加载逻辑
// 例如:请求广告、创建广告对象、设置监听器等
loaded = true;
// 如果是普通加载成功
callLoadSuccess();
// 如果是竞价加载成功,也可以回传价格
// callLoadBiddingSuccess(new BidPrice("12.34"));
} catch (Exception e) {
callLoadFail(new WMAdapterError(1001, "Reward load failed: " + e.getMessage()));
}
}
public void onAdShow() {
callVideoAdShow();
}
public void onAdClick() {
callVideoAdClick();
}
public void onAdClosed() {
callVideoAdClosed();
}
public void onVideoComplete() {
callVideoAdPlayComplete();
// 业务判断满足发奖条件后上报发奖
callVideoAdReward(true);
// 如果需要携带扩展数据:
Map<String, Object> extra = new HashMap<>();
extra.put("rewardCount", 1);
extra.put("rewardName", "gold");
callVideoAdRewardWithData(true, extra);
}
public void onAdSkipped() {
callVideoAdSkipped();
callVideoAdReward(false);
}
public void onAdError() {
callVideoAdPlayError(new WMAdapterError(1002, "Reward play error"));
}
@Override
public void destroyAd() {
super.destroyAd();
loaded = false;
}
}3.3 注意事项
callXXX()必须在正确生命周期调用。建议只在第三方 SDK 真正触发对应状态时调用,例如:- 加载完成后再调用
callLoadSuccess() - 真正展示后再调用
callVideoAdShow() - 播放完成后再调用
callVideoAdPlayComplete() - 满足发奖条件后再调用
callVideoAdReward(true)
- 加载完成后再调用
callVideoAdReward(...)不等于自动发奖。callVideoAdReward(true)只是通知上层“已满足发奖条件”,真正的奖励发放通常仍需由业务或宿主侧结合自己的规则处理。callVideoAdRewardWithData(...)里的自定义数据要尽量稳定。destroyAd()后不要继续回调。对象销毁后:- 事件引用已清空
- 再调用
callXXX()不会有上层响应 - 也可能造成业务逻辑混乱
竞价场景建议同步回传价格。如果激励视频支持竞价,建议在合适时机调用
callLoadBiddingSuccess(BidPrice price)。这样上层可以更准确地处理竞价结果和统计。
4. Interstitial Adapter
WMCustomInterstitialAdapter 是 WindMill SDK 中 自定义插屏广告适配器 的基类,通常用于 第三方广告网络适配器继承实现。
它的主要职责是:
- 统一承接第三方广告网络的插屏广告生命周期
- 将第三方 SDK 的加载、展示、点击、关闭、播放完成、跳过等事件,转换为 WindMill SDK 可识别的回调
- 提供插屏广告类型读取能力,方便适配不同插屏子类型
- 简化自定义插屏适配器的开发,让子类专注于对接具体广告网络
4.1 API 说明
| 函数名称 | 参数列表 | 返回值类型 | 参数说明 | 函数作用 |
|---|---|---|---|---|
getInterstitialAdType() | 无 | int | 无 | 获取当前插屏广告类型;若未配置则返回 WMConstants.AD_INTERSTITIAL_TYPE_UNKNOWN |
callLoadSuccess() | 无 | void | 无 | 通知上层:插屏广告加载成功 |
callLoadBiddingSuccess(...) | BidPrice price | void | price:竞价成功价格信息 | 通知上层:插屏广告竞价加载成功,并上报价格 |
callLoadFail(...) | WMAdapterError adapterError | void | adapterError:加载失败原因 | 通知上层:插屏广告加载失败 |
callVideoAdPlayError(...) | WMAdapterError adapterError | void | adapterError:播放错误原因 | 通知上层:插屏视频播放失败 |
callVideoAdShow() | 无 | void | 无 | 通知上层:插屏广告已展示 |
callVideoAdClick() | 无 | void | 无 | 通知上层:插屏广告被点击 |
callVideoAdDownload() | 无 | void | 无 | 通知上层:广告触发下载行为 |
callVideoAdClosed() | 无 | void | 无 | 通知上层:插屏广告已关闭 |
callVideoAdPlayComplete() | 无 | void | 无 | 通知上层:视频播放完成 |
callVideoAdSkipped() | 无 | void | 无 | 通知上层:视频被跳过 |
destroyAd() | 无 | void | 无 | 销毁广告并清空事件引用 |
4.2 使用示例
下面给出一个典型的插屏广告适配器实现示例。
package com.example.ad;
import android.content.Context;
import android.text.TextUtils;
import com.windmill.sdk.WMConstants;
import com.windmill.sdk.base.WMAdapterError;
import com.windmill.sdk.custom.WMCustomInterstitialAdapter;
import com.windmill.sdk.models.BidPrice;
import java.util.Map;
public class MyInterstitialAdapter extends WMCustomInterstitialAdapter {
private Object adObject;
private String placementId;
@Override
public void loadAd(Context context, Map<String, Object> localExtra, Map<String, Object> serverExtra) {
try {
placementId = String.valueOf(serverExtra.get(WMConstants.PLACEMENT_ID));
if (TextUtils.isEmpty(placementId)) {
callLoadFail(new WMAdapterError(1001, "placementId is empty"));
return;
}
// 这里对接第三方广告网络的加载逻辑
// TODO: request interstitial ad
// 模拟加载成功
adObject = new Object();
// 如果是普通加载成功
callLoadSuccess();
// 如果是竞价成功,可以同时回传价格
// callLoadBiddingSuccess(new BidPrice("12.34"));
} catch (Exception e) {
callLoadFail(new WMAdapterError(1002, "load interstitial failed: " + e.getMessage()));
}
}
@Override
public boolean isReady() {
return adObject != null;
}
@Override
public Object getChannelObject() {
return adObject;
}
public void showAd() {
if (!isReady()) {
callVideoAdPlayError(new WMAdapterError(2001, "ad is not ready"));
return;
}
// 模拟展示流程
callVideoAdShow();
// 用户点击
// callVideoAdClick();
// 播放完成
callVideoAdPlayComplete();
// 关闭广告
callVideoAdClosed();
}
public void onAdClicked() {
callVideoAdClick();
}
public void onAdSkipped() {
callVideoAdSkipped();
callVideoAdClosed();
}
public void onDownloadStart() {
callVideoAdDownload();
}
@Override
public void destroyAd() {
super.destroyAd();
adObject = null;
}
}4.3 注意事项
callXXX()应在正确生命周期调用。建议只在第三方 SDK 真实触发对应状态 后再调用,例如:- 加载成功后再调用
callLoadSuccess() - 真正展示后再调用
callVideoAdShow() - 用户点击后再调用
callVideoAdClick() - 广告关闭后再调用
callVideoAdClosed() - 视频播放完成后再调用
callVideoAdPlayComplete()
- 加载成功后再调用
销毁后不要继续回调。调用
destroyAd()后:- 事件引用会被清空
- 再调用
callXXX()不会再向上层传递事件 - 业务上也可能导致状态错乱
竞价场景要正确上报价格。如果你的插屏广告支持竞价,建议在合适时机调用
callLoadBiddingSuccess(...),这样上层可以更准确地处理竞价流程和统计。
5. Splash Adapter
WMCustomSplashAdapter 是 WindMill SDK 自定义开屏广告适配器 的抽象基类,通常用于 业务方继承后对接第三方广告平台,并把广告加载、展示、点击、关闭等事件回调到 WindMill SDK。
5.1 API 说明
| 函数名称 | 参数列表 | 返回值类型 | 参数说明 | 函数作用 |
|---|---|---|---|---|
showAd(...) | ViewGroup viewGroup, Map<String, Object> serverExtra | void | viewGroup 为广告容器;serverExtra 为服务端额外参数 | 子类实现开屏广告展示逻辑 |
getSplashType() | 无 | int | 无 | 获取开屏广告类型;若未配置则返回默认类型 |
callLoadSuccess() | 无 | void | 无 | 通知 SDK:广告加载成功 |
callLoadBiddingSuccess(...) | BidPrice price | void | price 为竞价成功信息 | 通知 SDK:广告竞价加载成功 |
callLoadFail(...) | WMAdapterError adapterError | void | adapterError 为失败原因 | 通知 SDK:广告加载失败 |
callSplashAdShowError(...) | WMAdapterError adapterError | void | adapterError 为展示失败原因 | 通知 SDK:广告展示失败 |
callSplashAdShow() | 无 | void | 无 | 通知 SDK:广告已展示 |
callSplashAdClick() | 无 | void | 无 | 通知 SDK:广告被点击 |
callSplashAdClosed() | 无 | void | 无 | 通知 SDK:广告已关闭;内部做了防重复关闭保护 |
callSplashAdSkipped() | 无 | void | 无 | 通知 SDK:广告被跳过,并自动触发关闭回调 |
destroyAd() | 无 | void | 无 | 销毁适配器持有的事件引用,释放资源 |
5.2 示例代码
package com.example.ads;
import android.view.View;
import android.view.ViewGroup;
import com.windmill.sdk.custom.WMCustomSplashAdapter;
import com.windmill.sdk.base.WMAdapterError;
import com.windmill.sdk.models.BidPrice;
import java.util.Map;
public class MySplashAdapter extends WMCustomSplashAdapter {
@Override
public void showAd(ViewGroup viewGroup, Map<String, Object> serverExtra) {
// 1. 初始化第三方开屏广告
// 2. 将广告视图添加到 viewGroup
// 3. 根据实际结果回调 SDK
try {
// 假设这里已经成功展示广告
callLoadSuccess();
callSplashAdShow();
// 示例:给广告加点击监听
View adView = new View(viewGroup.getContext());
adView.setOnClickListener(v -> callSplashAdClick());
viewGroup.removeAllViews();
viewGroup.addView(adView);
} catch (Throwable t) {
callLoadFail(new WMAdapterError(/* 根据你的错误构造 */));
}
}
// 如果需要,也可以在合适时机调用:
public void onShowError(WMAdapterError error) {
callSplashAdShowError(error);
}
public void onAdClosed() {
callSplashAdClosed();
}
public void onAdSkipped() {
callSplashAdSkipped();
}
public void onBiddingSuccess(BidPrice price) {
callLoadBiddingSuccess(price);
}
}5.3 注意事项
callSplashAdClosed()有防重复机制。如果你在业务逻辑中重复调用关闭回调,第二次开始不会再通知 SDK。建议只在真实关闭时触发一次。callSplashAdSkipped()会自动触发关闭。如果你的“跳过”逻辑本身已经会关闭广告,就不要再重复手动调用callSplashAdClosed(),避免逻辑混乱。destroyAd()后不要再继续回调。destroyAd()会清空内部事件引用。调用后请避免再触发展示、点击、关闭等回调。
6 Native Adapter
WMCustomNativeAdDataEvent 是 WindMill SDK 中自定义原生广告数据事件的代理基类,通常用于子类继承后,在你自己的自定义原生广告数据对象中,统一向 SDK 上报原生广告相关事件。
6.1 API 说明
| 函数名称 | 参数列表 | 返回值类型 | 参数说明 | 函数作用 |
|---|---|---|---|---|
destroy() | 无 | void | 无 | 释放资源,子类可重写做清理 |
callNativeAdShow() | 无 | void | 无 | 上报原生广告曝光 |
callNativeAdClick() | 无 | void | 无 | 上报原生广告点击 |
callNativeAdLangPageShow() | 无 | void | 无 | 上报落地页展示 |
callNativeAdLangPageClose() | 无 | void | 无 | 上报落地页关闭 |
callNativeAdShowError(...) | WMAdapterError adapterError:展示错误 | void | 展示失败原因 | 上报原生广告展示失败 |
callNativeAdDislikeShow() | 无 | void | 无 | 上报“不感兴趣”弹层展示 |
callNativeAdDislikeSelect(...) | int position, String value, boolean enforce | void | 选项位置、文案、是否强制 | 上报“不感兴趣”选项被选择 |
callNativeAdDislikeDismiss() | 无 | void | 无 | 上报“不感兴趣”弹层关闭 |
callNativeAdVideoLoad() | 无 | void | 无 | 上报视频加载完成/开始可用 |
callNativeAdVideoProgressUpdate(...) | long current, long duration | void | 当前进度、视频总时长 | 上报视频播放进度 |
callNativeAdVideoError(...) | WMAdapterError wmAdapterError:视频错误 | void | 视频播放错误信息 | 上报视频播放错误 |
callNativeAdVideoStart() | 无 | void | 无 | 上报视频开始播放 |
callNativeAdVideoPause() | 无 | void | 无 | 上报视频暂停 |
callNativeAdVideoResume() | 无 | void | 无 | 上报视频恢复播放 |
callNativeAdVideoCompleted() | 无 | void | 无 | 上报视频播放完成 |
callNativeAdRenderSuccess(...) | View view, float width, float height | void | 渲染成功的 View、宽高 | 上报广告渲染成功 |
callNativeAdAPKDownloadIdle() | 无 | void | 无 | 上报 APK 下载空闲状态 |
callNativeAdAPKDownloadActive(...) | long totalBytes, long currBytes, String fileName, String appName | void | 总字节、当前字节、文件名、应用名 | 上报 APK 下载中 |
callNativeAdAPKDownloadPaused(...) | long totalBytes, long currBytes, String fileName, String appName | void | 同上 | 上报 APK 下载暂停 |
callNativeAdAPKDownloadFailed(...) | long totalBytes, long currBytes, String fileName, String appName | void | 同上 | 上报 APK 下载失败 |
callNativeAdAPKDownloadFinished(...) | long totalBytes, String fileName, String appName | void | 总字节、文件名、应用名 | 上报 APK 下载完成 |
callNativeAdAPKDownloadInstalled(...) | String fileName, String appName | void | 文件名、应用名 | 上报 APK 安装完成 |
callNativeAdShakeDismiss() | 无 | void | 无 | 上报摇一摇关闭/消失 |
6.2 示例
下面给一个简化的自定义原生广告数据示例,展示如何继承并上报事件。
package com.example.ad;
import android.view.View;
import com.windmill.sdk.base.WMAdapterError;
import com.windmill.sdk.custom.WMCustomNativeAdDataEvent;
public class MyNativeAdData extends WMCustomNativeAdDataEvent {
private View adView;
public MyNativeAdData(View adView) {
this.adView = adView;
}
/**
* 广告渲染成功后调用
*/
public void onRenderSuccess(float width, float height) {
callNativeAdRenderSuccess(adView, width, height);
}
/**
* 广告曝光后调用
*/
public void onAdShown() {
callNativeAdShow();
}
/**
* 用户点击广告后调用
*/
public void onAdClicked() {
callNativeAdClick();
}
/**
* 视频开始播放
*/
public void onVideoStart() {
callNativeAdVideoStart();
}
/**
* 视频播放完成
*/
public void onVideoCompleted() {
callNativeAdVideoCompleted();
}
/**
* 下载中
*/
public void onDownloadProgress(long totalBytes, long currBytes, String fileName, String appName) {
callNativeAdAPKDownloadActive(totalBytes, currBytes, fileName, appName);
}
/**
* 发生错误
*/
public void onShowError(WMAdapterError error) {
callNativeAdShowError(error);
}
@Override
public void destroy() {
super.destroy();
adView = null;
}
}6.3 调用时机建议
| 场景 | 建议调用的方法 |
|---|---|
| 原生广告已经展示到界面 | callNativeAdShow() |
| 用户点击广告区域 | callNativeAdClick() |
| 落地页打开 | callNativeAdLangPageShow() |
| 落地页关闭 | callNativeAdLangPageClose() |
| 视频开始播放 | callNativeAdVideoStart() |
| 视频暂停 / 恢复 / 完成 | callNativeAdVideoPause() / callNativeAdVideoResume() / callNativeAdVideoCompleted() |
| 视频进度更新 | callNativeAdVideoProgressUpdate(current, duration) |
| 渲染成功 | callNativeAdRenderSuccess(view, width, height) |
| 下载状态变化 | callNativeAdAPKDownload...() 系列 |
| 不感兴趣弹窗展示 / 关闭 / 选择 | callNativeAdDislikeShow() / callNativeAdDislikeDismiss() / callNativeAdDislikeSelect(...) |