Skip to content

自定义广告网络 ​

1. 初始化 SDK ​

WMCustomAdapterProxy 是自定义广告网络初始化代理的基类,用于把“渠道 SDK 初始化结果”回传给 ToBid。开发者通常只需要继承该类,并实现必要的初始化与版本相关方法即可。

继承 WMCustomAdapterProxy,最少需要完成下面 4 件事:

  1. 实现 initializeADN(...):完成渠道 SDK 初始化
  2. 实现 getNetworkSdkVersion():返回当前渠道 SDK 版本号
  3. 实现 baseOnToBidCustomAdapterVersion():返回当前自定义适配器协议版本
  4. 在初始化前后调用以下回调:
    • callInitBefore(...)
    • callInitSuccess()
    • callInitFail(...)
java
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 listenervoidchannelId 用于标识当前渠道;listener 用于接收初始化前/成功/失败回调final 方法,不建议重写;内部会保存渠道 ID 和监听器
callInitBefore(...)Object initInstancevoid在真正初始化渠道 SDK 之前调用,通知 ToBid 已进入初始化前阶段如果 APP 已设置监听器,会回调 onNetworkInitBefore(...)
callInitSuccess()无void通知 ToBid:渠道 SDK 初始化成功内部已做异常捕获;建议在 SDK 真正可用后再调用
callInitFail(...)int code, String messagevoid通知 ToBid:渠道 SDK 初始化失败内部已做异常捕获;建议尽量传入可定位的问题信息
getAdapterSdkVersion()无int,默认值 47000自定义适配器版本号,用于标识适配器能力版本非强制实现;当前基类默认返回 47000
baseOnToBidCustomAdapterVersion()无int返回基于 ToBid 自定义适配器接口的版本号抽象方法,子类必须实现
getNetworkSdkVersion()无String返回当前广告网络 SDK 版本号定义在接口中,子类必须实现
notifyPrivacyStatusChange()无void通知渠道 SDK 隐私状态变化定义在接口中,子类必须实现
initializeADN(...)Context context, Map<String, Object> serverExtravoid执行渠道 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 注意事项 ​

  1. setInitListener(...) 必须先于初始化调用

    • 否则 callInitBefore()、callInitSuccess()、callInitFail() 将无法回传给 ToBid。
  2. 初始化成功/失败只能有一个最终结果

    • 初始化流程中请避免重复调用 callInitSuccess() 或 callInitFail()。
  3. callInitBefore(...) 应在真正初始化前调用

    • 这样 ToBid 才能正确感知当前渠道进入初始化阶段。
  4. getNetworkSdkVersion() 不要返回空值

    • 建议返回明确的版本号字符串,便于排查问题与版本兼容。
  5. baseOnToBidCustomAdapterVersion() 必须实现

    • 这是自定义适配器协议版本标识,ToBid 会据此做兼容判断。
  6. callInitFail(...) 的错误码和错误信息应尽量明确

    • 方便定位渠道 SDK 初始化失败原因。
  7. 回调内部已做异常捕获,但业务初始化代码仍需自行保护

    • 初始化逻辑建议使用 try-catch 包裹,避免异常影响主流程。
  8. 所有初始化相关调用建议在主线程规范下使用

    • 避免在初始化链路中引入不必要的耗时操作。

2. 实现 Banner Adapter ​

WMCustomBannerAdapter 是横幅广告(Banner)场景下的自定义适配器基类,通常用于由第三方广告网络适配器继承实现。

它的主要职责是:

  1. 提供 Banner 广告 View 的统一出口
  2. 将第三方广告网络的加载、展示、点击、关闭等状态,统一回调给 WindMill SDK
  3. 简化 Banner 适配器的开发,让子类专注于对接具体广告网络

2.1 API 说明 ​

函数名称参数列表返回值类型参数说明函数作用
getBannerView()无View无抽象方法。由子类实现,返回 Banner 广告展示用的 View。
destroyAd()无void无销毁广告相关引用,避免内存泄漏。
callLoadSuccess()无void无通知 ToBid SDK:Banner 加载成功。
callLoadBiddingSuccess(...)BidPrice pricevoidprice:竞价成功价格信息通知 ToBid SDK:Banner 竞价加载成功,并上报竞价价格。
callLoadFail(...)WMAdapterError adapterErrorvoidadapterError:加载失败原因通知 ToBid SDK:Banner 加载失败。
callBannerAdShow()无void无通知 ToBid SDK:Banner 已展示。
callBannerAdShowError(...)WMAdapterError adapterErrorvoidadapterError:展示失败原因通知 ToBid SDK:Banner 展示失败。
callBannerAdClick()无void无通知 ToBid SDK:Banner 被点击。
callBannerAdClosed()无void无通知 ToBid SDK:Banner 被关闭。

2.2 使用示例 ​

下面是一个 Banner 自定义适配器的典型实现方式。

java
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 注意事项 ​

  1. destroyAd() 当前父类只释放了事件监听引用。如果子类持有第三方广告对象、View、Activity 引用等,也需要在子类中自行释放。

  2. callXXX() 方法应在正确生命周期调用,建议在第三方 SDK 确认真实状态后再调用,例如:

    • 加载成功后再调用 callLoadSuccess()
    • 真正展示后再调用 callBannerAdShow()
    • 点击后再调用 callBannerAdClick()
    • 关闭后再调用 callBannerAdClosed()
  3. getBannerView() 建议返回稳定的 View 实例。如果第三方 SDK 的 Banner View 会被宿主复用,建议确保:

    • 不要频繁重复创建
    • 销毁后不要继续复用旧 View
    • 与宿主页面生命周期一致
  4. 竞价场景需要正确上报价格。如果 Banner 是竞价模式,建议在加载完成后同步上报竞价结果,确保上层统计和竞价流程一致。

3. Reward Adapter ​

WMCustomRewardAdapter 是 激励视频广告(Reward Video) 场景下的自定义适配器基类,通常用于 第三方广告网络适配器继承实现。

它的主要作用是:

  1. 统一承接第三方广告网络的激励视频广告加载、展示、点击、关闭、播放完成、发奖等事件
  2. 将第三方 SDK 的状态回调转换为 WindMill SDK 可识别的事件
  3. 简化激励视频适配器开发,让子类专注于对接具体广告网络

3.1 API 说明 ​

函数名称参数列表返回值类型参数说明函数作用
getRewardExtraOption()无Map<String, Object>无返回激励视频相关的额外配置项;默认返回空 Map
getRewardType()无int从 mediaExtraInfo 中读取奖励类型字段获取激励视频类型;若未配置则默认返回 1
destroyAd()无void无销毁广告并清空事件引用,减少资源泄漏
callLoadSuccess()无void无通知上层:广告加载成功
callLoadBiddingSuccess(...)BidPrice price: 竞价价格对象voidprice:竞价成功价格信息通知上层:广告竞价加载成功,并上报价格
callLoadFail(...)WMAdapterError adapterError: 错误对象voidadapterError:加载失败原因通知上层:广告加载失败
callVideoAdPlayError(...)WMAdapterError adapterError: 错误对象voidadapterError:播放错误原因通知上层:视频播放失败
callVideoAdShow()无void无通知上层:视频广告已展示
callVideoAdClick()无void无通知上层:视频广告被点击
callVideoAdDownload()无void无通知上层:广告触发下载行为
callVideoAdClosed()无void无通知上层:视频广告已关闭
callVideoAdPlayComplete()无void无通知上层:视频播放完成
callVideoAdSkipped()无void无通知上层:视频被跳过
callVideoAdReward(...)boolean isReward: 是否发奖voidtrue 表示发奖,false 表示不发奖通知上层:奖励发放结果
callVideoAdRewardWithData(...)boolean isReward, Map<String, Object> customDatavoidisReward: 是否发奖;customData: 自定义数据通知上层:奖励结果,并携带自定义数据

3.2 使用示例 ​

下面给出一个典型的激励视频适配器实现示例。

java
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 注意事项 ​

  1. callXXX() 必须在正确生命周期调用。建议只在第三方 SDK 真正触发对应状态时调用,例如:

    • 加载完成后再调用 callLoadSuccess()
    • 真正展示后再调用 callVideoAdShow()
    • 播放完成后再调用 callVideoAdPlayComplete()
    • 满足发奖条件后再调用 callVideoAdReward(true)
  2. callVideoAdReward(...) 不等于自动发奖。callVideoAdReward(true) 只是通知上层“已满足发奖条件”,真正的奖励发放通常仍需由业务或宿主侧结合自己的规则处理。

  3. callVideoAdRewardWithData(...) 里的自定义数据要尽量稳定。

  4. destroyAd() 后不要继续回调。对象销毁后:

    • 事件引用已清空
    • 再调用 callXXX() 不会有上层响应
    • 也可能造成业务逻辑混乱
  5. 竞价场景建议同步回传价格。如果激励视频支持竞价,建议在合适时机调用 callLoadBiddingSuccess(BidPrice price)。这样上层可以更准确地处理竞价结果和统计。

4. Interstitial Adapter ​

WMCustomInterstitialAdapter 是 WindMill SDK 中 自定义插屏广告适配器 的基类,通常用于 第三方广告网络适配器继承实现。

它的主要职责是:

  1. 统一承接第三方广告网络的插屏广告生命周期
  2. 将第三方 SDK 的加载、展示、点击、关闭、播放完成、跳过等事件,转换为 WindMill SDK 可识别的回调
  3. 提供插屏广告类型读取能力,方便适配不同插屏子类型
  4. 简化自定义插屏适配器的开发,让子类专注于对接具体广告网络

4.1 API 说明 ​

函数名称参数列表返回值类型参数说明函数作用
getInterstitialAdType()无int无获取当前插屏广告类型;若未配置则返回 WMConstants.AD_INTERSTITIAL_TYPE_UNKNOWN
callLoadSuccess()无void无通知上层:插屏广告加载成功
callLoadBiddingSuccess(...)BidPrice pricevoidprice:竞价成功价格信息通知上层:插屏广告竞价加载成功,并上报价格
callLoadFail(...)WMAdapterError adapterErrorvoidadapterError:加载失败原因通知上层:插屏广告加载失败
callVideoAdPlayError(...)WMAdapterError adapterErrorvoidadapterError:播放错误原因通知上层:插屏视频播放失败
callVideoAdShow()无void无通知上层:插屏广告已展示
callVideoAdClick()无void无通知上层:插屏广告被点击
callVideoAdDownload()无void无通知上层:广告触发下载行为
callVideoAdClosed()无void无通知上层:插屏广告已关闭
callVideoAdPlayComplete()无void无通知上层:视频播放完成
callVideoAdSkipped()无void无通知上层:视频被跳过
destroyAd()无void无销毁广告并清空事件引用

4.2 使用示例 ​

下面给出一个典型的插屏广告适配器实现示例。

java
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 注意事项 ​

  1. callXXX() 应在正确生命周期调用。建议只在第三方 SDK 真实触发对应状态 后再调用,例如:

    • 加载成功后再调用 callLoadSuccess()
    • 真正展示后再调用 callVideoAdShow()
    • 用户点击后再调用 callVideoAdClick()
    • 广告关闭后再调用 callVideoAdClosed()
    • 视频播放完成后再调用 callVideoAdPlayComplete()
  2. 销毁后不要继续回调。调用 destroyAd() 后:

    • 事件引用会被清空
    • 再调用 callXXX() 不会再向上层传递事件
    • 业务上也可能导致状态错乱
  3. 竞价场景要正确上报价格。如果你的插屏广告支持竞价,建议在合适时机调用 callLoadBiddingSuccess(...),这样上层可以更准确地处理竞价流程和统计。

5. Splash Adapter ​

WMCustomSplashAdapter 是 WindMill SDK 自定义开屏广告适配器 的抽象基类,通常用于 业务方继承后对接第三方广告平台,并把广告加载、展示、点击、关闭等事件回调到 WindMill SDK。

5.1 API 说明 ​

函数名称参数列表返回值类型参数说明函数作用
showAd(...)ViewGroup viewGroup, Map<String, Object> serverExtravoidviewGroup 为广告容器;serverExtra 为服务端额外参数子类实现开屏广告展示逻辑
getSplashType()无int无获取开屏广告类型;若未配置则返回默认类型
callLoadSuccess()无void无通知 SDK:广告加载成功
callLoadBiddingSuccess(...)BidPrice pricevoidprice 为竞价成功信息通知 SDK:广告竞价加载成功
callLoadFail(...)WMAdapterError adapterErrorvoidadapterError 为失败原因通知 SDK:广告加载失败
callSplashAdShowError(...)WMAdapterError adapterErrorvoidadapterError 为展示失败原因通知 SDK:广告展示失败
callSplashAdShow()无void无通知 SDK:广告已展示
callSplashAdClick()无void无通知 SDK:广告被点击
callSplashAdClosed()无void无通知 SDK:广告已关闭;内部做了防重复关闭保护
callSplashAdSkipped()无void无通知 SDK:广告被跳过,并自动触发关闭回调
destroyAd()无void无销毁适配器持有的事件引用,释放资源

5.2 示例代码 ​

java
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 注意事项 ​

  1. callSplashAdClosed() 有防重复机制。如果你在业务逻辑中重复调用关闭回调,第二次开始不会再通知 SDK。建议只在真实关闭时触发一次。

  2. callSplashAdSkipped() 会自动触发关闭。如果你的“跳过”逻辑本身已经会关闭广告,就不要再重复手动调用 callSplashAdClosed(),避免逻辑混乱。

  3. 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 enforcevoid选项位置、文案、是否强制上报“不感兴趣”选项被选择
callNativeAdDislikeDismiss()无void无上报“不感兴趣”弹层关闭
callNativeAdVideoLoad()无void无上报视频加载完成/开始可用
callNativeAdVideoProgressUpdate(...)long current, long durationvoid当前进度、视频总时长上报视频播放进度
callNativeAdVideoError(...)WMAdapterError wmAdapterError:视频错误void视频播放错误信息上报视频播放错误
callNativeAdVideoStart()无void无上报视频开始播放
callNativeAdVideoPause()无void无上报视频暂停
callNativeAdVideoResume()无void无上报视频恢复播放
callNativeAdVideoCompleted()无void无上报视频播放完成
callNativeAdRenderSuccess(...)View view, float width, float heightvoid渲染成功的 View、宽高上报广告渲染成功
callNativeAdAPKDownloadIdle()无void无上报 APK 下载空闲状态
callNativeAdAPKDownloadActive(...)long totalBytes, long currBytes, String fileName, String appNamevoid总字节、当前字节、文件名、应用名上报 APK 下载中
callNativeAdAPKDownloadPaused(...)long totalBytes, long currBytes, String fileName, String appNamevoid同上上报 APK 下载暂停
callNativeAdAPKDownloadFailed(...)long totalBytes, long currBytes, String fileName, String appNamevoid同上上报 APK 下载失败
callNativeAdAPKDownloadFinished(...)long totalBytes, String fileName, String appNamevoid总字节、文件名、应用名上报 APK 下载完成
callNativeAdAPKDownloadInstalled(...)String fileName, String appNamevoid文件名、应用名上报 APK 安装完成
callNativeAdShakeDismiss()无void无上报摇一摇关闭/消失

6.2 示例 ​

下面给一个简化的自定义原生广告数据示例,展示如何继承并上报事件。

java
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(...)