横幅广告
一、需要实现的抽象方法
- 开发者只需要继承TPBannerAdapter并重写相关方法:- 开发者调用TP SDK的loadAd()API时,会调用到自定义Adapter的loadCustomAd()方法
- 开发者调用TP SDK的destory()API时,会调用到自定义Adapter的clean()方法
 
- 开发者调用TP SDK的
| 抽象方法 | 参数说明 | 返回值 | 作用 | 
|---|---|---|---|
| loadCustomAd() | context 上下文; userParams 本地配置参数;tpParams 服务器下发参数 | Context;Map;Map | 用于获取服务器下发和本地配置的参数,实现自定义广告的加载逻辑 | 
| clean() | ----- | ----- | 用于释放资源 | 
| getNetworkVersion() | ----- | String | 自定义三方广告的版本号 | 
| getNetworkName() | ----- | String | 自定义三方广告的名称 | 
二、横幅广告事件回调
(1)mLoadAdapterListener实现广告事件的回调
| 方法 | 说明 | 
|---|---|
| loadAdapterLoadFailed(TPError) | 实现广告事件的加载失败回调。TPError见下面介绍。 | 
| loadAdapterLoaded(TPBaseAd) | 实现广告事件加载成功回调,需要将自定义广告平台的广告信息包装在继承 TPBaseAd对象里回传给TP。 | 
(2)广告加载成功之后,需要创建TPBannerAdImpl,传入自定义广告平台已经加载成功的View的对象,再通过 mLoadAdapterListener.loadAdapterLoaded()方法回调出去。
//参数1:默认传null;参数2:自定义广告平台加载成功的view
TPBannerAdImpl mTpBannerAd = new TPBannerAdImpl(null, view);
//通过loadAdapterLoaded,实现广告事件加载成功回调
 mLoadAdapterListener.loadAdapterLoaded(mTpBannerAd);
(3)通过**TPBannerAdImpl的对象实现展示广告事件的回调**
| 方法 | 说明 | 
|---|---|
| onAdShown() | 实现广告事件的展示回调。 | 
| onAdClosed() | 实现广告事件的关闭回调。 | 
| onAdClicked() | 实现广告事件的点击回调。 | 
三、其他API说明
- TPError方法
 TPError tpError = new TPError(NETWORK_NO_FILL);
 tpError.setErrorCode(adError.getErrorCode() +"");
 tpError.setErrorMessage(adError.getErrorMessage());
| TPError方法 | 说明 | 
|---|---|
| setTpErrorCode() | 设置三方的ErrorCode错误码。 | 
| setErrorMessage() | 设置三方的ErrorMsg错误信息。 | 
| NETWORK_NO_FILL | 自定义广告平台NOFILL。 | 
| ADAPTER_CONFIGURATION_ERROR | 自定义广告平台服务器下发参数错误。 | 
| SHOW_FAILED | 自定义广告平台展示失败。 | 
- loadCustomAd()中本地配置参数常量
| 常量 | 说明 | 
|---|---|
| AppKeyManager.GDPR_CONSENT | GDPR,了解更多见政策合规,下同 | 
| AppKeyManager.KEY_GDPR_CHILD | GDPRChild,GDPR儿童 | 
| AppKeyManager.KEY_COPPA | COPPA,美国儿童在线隐私权保护法 | 
| AppKeyManager.KEY_CCPA | CPPA,加州消费者隐私法案 | 
四、特定平台说明
加载成功直接回调展示的平台
- 
部分平台加载成功后不会检测bannerView是否展示在屏幕上,会立即回调展示 
- 
由于TP内部ShowListener只有在调用showApi时才会生成,所以这类平台不建议在 三方展示回调中直接调用 mTpBannerAd.adShown(),会有概率导致收不到TP的onAdImpression回调
- 
建议实现方式是广告加载成功之后,将自定义广告平台的广告信息包装在继承TPBaseAd对象里,再通过 mLoadAdapterListener.loadAdapterLoaded(TPBaseAd tpbaseAd)方法回调加载成功 
- 
以PubMaticBanner举例: 
private CustomPubmaticBannerAd customPubmaticNativeAd;
@Override
public void onAdReceived(@NonNull POBBannerView view) {
    customPubmaticNativeAd = new CustomPubmaticBannerAd(view);
    if (mLoadAdapterListener != null) {
        mLoadAdapterListener.loadAdapterLoaded(customPubmaticNativeAd);
    }
}
@Override
public void onAdClosed(@NonNull POBBannerView view) {
    if (customPubmaticNativeAd != null) {
        customPubmaticNativeAd.adClosed();
    }
}
@Override
public void onAdClicked(@NonNull POBBannerView view) {
    if (customPubmaticNativeAd != null) {
        customPubmaticNativeAd.adClicked();
    }
}
@Override
public void onAdImpression(@NonNull POBBannerView view) {
    // 由于此 API 在 onAdReceived 后会被立即调用,此时 TPBannerAdImpl 的 mShowListener 可能还未初始化,导致调用失效
}
- CustomPubmaticBannerAd类继承TPBaseAd,重写TPBaseAd类,实现如下两个方法
@Override 
public int getNativeAdType () {
    return AD_TYPE_NATIVE_EXPRESS;
}
// RenderView中返回PubMatic加载成功的BannerView,同时回调广告事件的展示
@Override 
public View getRenderView () {
    if (mShowListener != null) {
        mShowListener.onAdShown();
    }
    return pobBannerView;
}
// 实现广告事件的关闭回调
public void adClosed () {
    if (mShowListener != null) {
        mShowListener.onAdClosed();
    }
}
// 实现广告事件的点击回调
public void adClicked () {
    if (mShowListener != null) {
        mShowListener.onAdClicked();
    }
}
五、示例代码
/*
* Banner类型需要继承TPBannerAdapter,并重写以下几个方法
* loadCustomAd() 用于获取服务器下发和本地配置的参数,实现自定义广告平台的加载逻辑
* clean() 当Banner广告从屏幕remove后,释放资源
* getNetworkVersion() 自定义三方源的版本号
* getNetworkName 自定义三方源的名称
* */
public class FacebookBannerAdapter extends TPBannerAdapter {
    private AdView mFacebookBanner;
    private String placementId;
    private TPBannerAdImpl mTpBannerAd;
    private static final String TAG = "FacebookBanner";
    @Override
    public void loadCustomAd(Context context, Map<String, Object> userParams, Map<String, String> tpParams) {
        // tpParams 获取从服务器端下发的字段
        if (tpParams.size() > 0 && tpParams.containsKey("placemntId")) {
            placementId = tpParams.get("placemntId");
        } else {
            /*
             * mLoadAdapterListener在oadCustomAd重写时同步生成
             * 回调方法loadAdapterLoaded :广告加载成功
             * 回调方法loadAdapterLoadFailed :广告加载失败
             *          构造TPError方法,ADAPTER_CONFIGURATION_ERROR 服务器下发参数错误
             *          方法setTpErrorCode 设置三方的ErrorCode错误码
             *          方法setErrorMessage 设置三方的ErrorMsg错误信息
             *
             * */
            if (mLoadAdapterListener != null) {
                mLoadAdapterListener.loadAdapterLoadFailed(new TPError(ADAPTER_CONFIGURATION_ERROR));
            }
            return;
        }
        // userParams 获取从本地配置的参数
        // 例如:海外源需要设置CCPA和COPPA,具体接入参考文档,高级功能-隐私规范部分
        FacebookInitializeHelper.setUserParams(userParams,mLoadAdapterListener);
        //初始化SDK
        FacebookInitializeHelper.initialize(context);
        //创建FB广告位对象,并按照配置下发的尺寸进行请求
        mFacebookBanner = new AdView(context, placementId, AdSize.BANNER_HEIGHT_50);
        //设置FB监听,并设置监听回调
        AdListener adListener = new AdListener() {
            @Override
            public void onError(Ad ad, AdError adError) {
                Log.i(TAG, "onError: code :" + adError.getErrorCode() + " , msg:" + adError.getErrorMessage());
                if (mLoadAdapterListener != null) {
                    TPError tpError = new TPError(SHOW_FAILED);
                    tpError.setErrorCode(adError.getErrorCode() + "");
                    tpError.setErrorMessage(adError.getErrorMessage());
                    mLoadAdapterListener.loadAdapterLoadFailed(tpError);
                }
            }
            @Override
            public void onAdLoaded(Ad ad) {
                Log.i(TAG, "onAdLoaded: ");
                if (mFacebookBanner == null) {
                    return;
                }
                if (mLoadAdapterListener != null) {
                    //Banner类型需要创建TPBannerAdImpl,传入已经加载成功的View的对象
                    mTpBannerAd = new TPBannerAdImpl(null, mFacebookBanner);
                    //将TPBannerAdImpl对象传入loadAdapterLoaded,实现广告事件加载成功回调
                    mLoadAdapterListener.loadAdapterLoaded(mTpBannerAd);
                }
            }
            @Override
            public void onAdClicked(Ad ad) {
                Log.i(TAG, "onAdClicked: ");
                //使用mTpBannerAd实现广告事件的点击回调
                if (mTpBannerAd != null) {
                    mTpBannerAd.adClicked();
                }
            }
            @Override
            public void onLoggingImpression(Ad ad) {
                Log.i(TAG, "onLoggingImpression: ");
                //使用mTpBannerAd实现广告事件的展示回调
                if (mTpBannerAd != null)
                    mTpBannerAd.adShown();
            }
        };
        //请求广告
        mFacebookBanner.loadAd(mFacebookBanner.buildLoadAdConfig().withAdListener(adListener).build());
    }
    @Override
    public void clean() {
        Log.i(TAG, "clean: ");
        if (mFacebookBanner != null) {
            Views.removeFromParent(mFacebookBanner);
            mFacebookBanner.destroy();
            mFacebookBanner = null;
        }
    }
    @Override
    public String getNetworkVersion() {
        // 自定义三方广告源的版本号
        return BuildConfig.VERSION_NAME;
    }
    @Override
    public String getNetworkName() {
        // 自定义三方广告源的名称
        return "audience-network";
    }
}