跳到主要内容

原生广告

一、需要实现的抽象方法

  • 开发者只需要继承TPNativeAdapter并重写相关方法:
    • 开发者调用TP SDK的loadAd() API时,会调用到自定义Adapter的loadCustomAd()方法
    • 开发者调用TP SDK的destory() API时,会调用到自定义Adapter的clean()方法
抽象方法参数说明返回值作用
loadCustomAd()context 上下文; userParams 本地配置参数;tpParams 服务器下发参数Context;Map;Map用于获取服务器下发和本地配置的参数,实现自定义广告的加载逻辑
clean()----------用于释放资源
getNetworkVersion()-----String自定义三方广告的版本号
getNetworkName()-----String自定义三方广告的名称

二、原生广告事件回调

(1)mLoadAdapterListener实现广告事件的回调

方法说明
loadAdapterLoadFailed(TPError)实现广告事件的加载失败回调。TPError见下面介绍。
loadAdapterLoaded(TPBaseAd)实现广告事件加载成功回调,需要将自定义广告平台的广告信息包装在继承TPBaseAd对象里回传给TP。

(2)广告加载成功之后,需要将自定义广告平台的广告信息包装在继承TPBaseAd对象里,再通过 mLoadAdapterListener.loadAdapterLoaded()方法回调出去,里面的方法实现可按照自定义广告平台的需求来实现,可以不用全部实现

抽象方法参数说明返回值作用
getNetworkObj()Object-----用于返回三方的对象,如果开发者需要自己拿素材,可以直接获取这个对象
registerClickView()viewGroup 开发者自己的布局; clickViews 可点击的广告view-----自渲染类型支持,开发者在渲染结束后,会把可点击的view传过来(addview前调用)
registerClickAfterRender()viewGroup 开发者自己的布局; clickViews 可点击的广告view-----同时支持自渲染和模版类型,该方法是addview值后调用,没有特殊需求可以不实现
getTPNativeView()-----TPNativeAdView的对象自渲染类型支持,用于获取TP包装过的对象,用于获取自渲染的所有素材。自渲染类型不能返回null。
getNativeAdType()-----int用于获取广告类型:AD_TYPE_NORMAL_NATIVE:自渲染;AD_TYPE_NATIVE_EXPRESS:模板渲染;AD_TYPE_NATIVE_LIST:多个模板view
getRenderView()-----view模版类型支持,用于获取模板渲染的view,对应广告类型AD_TYPE_NATIVE_EXPRESS。模版类型不能返回null。
getMediaViews()-----ListView模版类型支持,用于获取多模板渲染view,对应AD_TYPE_NATIVE_LIST
getCustomAdContainer()-----ViewGroup用于获取三方平台的容器(部分三方源需要用他们提供的容器)
clean()----------用于释放资源

(3)mShowListener实现展示广告事件的回调

方法说明
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_CONSENTGDPR,了解更多见政策合规,下同
AppKeyManager.KEY_GDPR_CHILDGDPRChild,GDPR儿童
AppKeyManager.KEY_COPPACOPPA,美国儿童在线隐私权保护法
AppKeyManager.KEY_CCPACPPA,加州消费者隐私法案

四、示例代码

/*
* Native类型需要继承TPNativeAdapter,并重写以下几个方法
* loadCustomAd() 用于获取服务器下发和本地配置的参数,实现自定义广告平台的加载逻辑
* clean() 当Banner广告从屏幕remove后,释放资源
* getNetworkVersion() 自定义三方源的版本号
* getNetworkName 自定义三方源的名称
* */
public class FacebookNativeAdapter extends TPNativeAdapter {

private NativeAd mFacebookNative;
private FacebookNativeAd mFacebookNativeAd;
private NativeBannerAd mNativeBannerAd;
private String placementId;
private Context mContext;
private static final String TAG = "FacebookNative";

@Override
public void loadCustomAd(Context context, Map<String, Object> userParams, Map<String, String> tpParams) {
mContext = context;
// 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_ACTIVITY_ERROR));
}
return;
}

// userParams 获取从本地配置的参数
// 例如:海外源需要设置CCPA和COPPA,具体接入参考文档,高级功能-隐私规范部分
FacebookInitializeHelper.setUserParams(userParams, mLoadAdapterListener);

//初始化SDK
FacebookInitializeHelper.initialize(context);

// 创建三方广告位对象
mFacebookNative = new NativeAd(context, placementId);
// 请求Native模版
mFacebookNative.loadAd(
mFacebookNative.buildLoadAdConfig()
.withAdListener(nativeAdListener)
.withMediaCacheFlag(NativeAdBase.MediaCacheFlag.ALL)
.build());

}

//设置FB监听,并设置监听回调
NativeAdListener nativeAdListener = new NativeAdListener() {
@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) {
// 模版Native
if (mFacebookNative != null) {
Log.i(TAG, "TemplateNativeAdLoaded: ");
View adView = NativeAdView.render(mContext, mFacebookNative);

// Add the Native Ad View to your ad container.
// The recommended dimensions for the ad container are:
// Width: 280dp - 500dp
// Height: 250dp - 500dp
RelativeLayout relativeLayout = new RelativeLayout(mContext);
relativeLayout.addView(adView, new RelativeLayout.LayoutParams(DeviceUtils.dip2px(mContext, 320)
, DeviceUtils.dip2px(mContext, 340)));
relativeLayout.setGravity(CENTER);

//Native类型广告加载成功之后,需要将自定义广告平台的广告信息包装在继承TPBaseAd对象里,再通过 mLoadAdapterListener.loadAdapterLoaded()方法回调出去
//参数2:原生的类型 AppKeyManager.TEMPLATE_RENDERING_YES为原生模版
mFacebookNativeAd = new FacebookNativeAd(relativeLayout, AppKeyManager.TEMPLATE_RENDERING_YES);
if (mLoadAdapterListener != null) {
mLoadAdapterListener.loadAdapterLoaded(mFacebookNativeAd);
}

} else {
/*
* 使用mLoadAdapterListener实现广告事件的加载失败回调
* */
if (mLoadAdapterListener != null) {
mLoadAdapterListener.loadAdapterLoadFailed(new TPError(UNSPECIFIED));
}
}

}

@Override
public void onAdClicked(Ad ad) {
Log.i(TAG, "onAdClicked: ");
//通过mFacebookNativeAd里面的方法执行广告事件的点击回调
if (mFacebookNativeAd != null)
mFacebookNativeAd.onAdViewClicked();
}

@Override
public void onLoggingImpression(Ad ad) {
Log.i(TAG, "onLoggingImpression: ");
//通过mFacebookNativeAd里面的方法执行广告事件的展示回调
if (mFacebookNativeAd != null)
mFacebookNativeAd.onAdViewExpanded();
}

@Override
public void onMediaDownloaded(Ad ad) {

}
};


@Override
public void clean() {
// 释放资源
AdSettings.clearTestDevices();
if (mFacebookNativeAd != null)
mFacebookNativeAd.clean();
}


@Override
public String getNetworkVersion() {
// 自定义三方广告源的版本号
return BuildConfig.VERSION_NAME;
}

@Override
public String getNetworkName() {
// 自定义三方广告源的名称
return "audience-network";
}
}

Loaded成功后将自定义广告平台的广告信息包装在继承TPBaseAd对象里,重写TPBaseAd类代码示例

public class FacebookNativeAd extends TPBaseAd {

private static final String TAG = "FacebookNative";
private NativeAd mFacebookNative;
private AdOptionsView adOptionsView;
private View mFacebookView;
private String mAdSize;
private Context mContext;
private int isRender;
private TPNativeAdView mNativeAdView; // 自渲染
private NativeAdLayout mContainer;

// 模版类型获取三方返回的View和广告类型
public FacebookNativeAd(View facebookView ,int templete) {
mFacebookView = facebookView;
isRender = templete;
}

// 自渲染类型通过TPNativeAdView包装过的三方对象
// private void initNativeAd(Context context) {
// mNativeAdView = new TPNativeAdView();
// mContainer = new NativeAdLayout(context);
// MediaView nativeAdMedia = new MediaView(context);
// adOptionsView = new AdOptionsView(context, mFacebookNative, mContainer);
//
// mNativeAdView.setCallToAction(mFacebookNative.getAdCallToAction());
// mNativeAdView.setTitle(mFacebookNative.getAdHeadline());
// mNativeAdView.setSubTitle(mFacebookNative.getAdBodyText());
// mNativeAdView.setAdSource(mFacebookNative.getSponsoredTranslation());
// mNativeAdView.setIconImageUrl(mFacebookNative.getAdIcon().getUrl());
// mNativeAdView.setMediaView(nativeAdMedia);
// }

public void onAdViewClicked() {
if (mShowListener != null) {
mShowListener.onAdClicked();
}
}

public void onAdViewExpanded() {
if (mShowListener != null) {
mShowListener.onAdShown();
}
}

/**
* 返回三方的对象,如果有开发者需要自己拿素材,可以直接获取这个对象
* @return
*/
@Override
public Object getNetworkObj() {
return mFacebookNative == null ? mFacebookNative : null;
}

/**
* 自渲染模式中,开发者在渲染结束后,会把可点击的view传过来(addview前调用)
* @param viewGroup 开发者自己的布局,主要的几个view用tag标记过了
* @param clickViews 可点击的广告view
*/
@Override
public void registerClickView(ViewGroup viewGroup, ArrayList<View> clickViews) {
// if (mFacebookNative != null) {
// View iconView = viewGroup.findViewWithTag(TPBaseAd.NATIVE_AD_TAG_ICON);
// if (mNativeAdView != null && mNativeAdView.getMediaView() instanceof MediaView && iconView instanceof ImageView) {
// mFacebookNative.registerViewForInteraction(
// viewGroup,
// (MediaView) mNativeAdView.getMediaView(),
// (ImageView) iconView,
// clickViews);
// }
//
// FrameLayout adChoicesView = viewGroup.findViewWithTag(TPBaseAd.NATIVE_AD_TAG_ADCHOICES);
// if (adChoicesView != null && adOptionsView != null) {
// adChoicesView.removeAllViews();
// adChoicesView.addView(adOptionsView, 0);
// }
// }
}

/**
* 获取tradplus包装过的对象,里面可以获取自渲染的所有素材
* 对应广告类型AD_TYPE_NORMAL_NATIVE
* @return
*/
@Override
public TPNativeAdView getTPNativeView() {
return null;
// return mNativeAdView;
}

/**
* 获取广告类型,
* AD_TYPE_NORMAL_NATIVE:自渲染,
* AD_TYPE_NATIVE_EXPRESS:模板渲染,
* AD_TYPE_NATIVE_LIST:多个模板view
* @return
*/
@Override
public int getNativeAdType() {
//返回广告类型,模板类型,自渲染类型
if (isRender == AppKeyManager.TEMPLATE_RENDERING_YES) {
return AD_TYPE_NATIVE_EXPRESS; //模版
} else {
return AD_TYPE_NORMAL_NATIVE;//自渲染
}
}

/**
* 获取模板渲染的view,对应广告类型AD_TYPE_NATIVE_EXPRESS
* @return
*/
@Override
public View getRenderView() {
if (mFacebookView != null) {
return mFacebookView;
} else {
return null;
}
}

/**
* 获取多模板渲染view,对应AD_TYPE_NATIVE_LIST
* @return
*/
@Override
public List<View> getMediaViews() {
return null;
}

/**
* 获取三方平台的容器(部分三方源需要用他们提供的容器)
* @return
*/
@Override
public ViewGroup getCustomAdContainer() {
return null;
}

// 释放资源
@Override
public void clean() {
if (mFacebookNative != null) {
mFacebookNative.unregisterView();
mFacebookNative.destroy();
mFacebookNative = null;
}
}
}