原生广告
一、需要实现的抽象方法
- 开发者只需要继承
TPNativeAdapter
并重写相关方法:- 开发者调用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)广告加载成功之后,需要将自定义广告平台的广告信息包装在继承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_CONSENT | GDPR,了解更多见政策合规,下同 |
AppKeyManager.KEY_GDPR_CHILD | GDPRChild,GDPR儿童 |
AppKeyManager.KEY_COPPA | COPPA,美国儿童在线隐私权保护法 |
AppKeyManager.KEY_CCPA | CPPA,加州消费者隐私法案 |
四、示例代码
/*
* 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;
}
}
}