-
Notifications
You must be signed in to change notification settings - Fork 46
Android CustomEvent
OpenMediation SDK支持自定义接入AdNetwork,通过给不在我们支持列表中的AdNetwork实现CustomEvent,使其能被SDK聚合。
免责声明:我们不鼓励使用不受支持的网络适配器,并且不对由于使用它们而引起的问题提供测试或技术支持。
AdTiming;
AdMob;
Facebook;
Unity;
Vungle;
AdColony;
AppLovin;
MoPub;
Tapjoy;
Chartboost;
Mintegral;
为了实现对CustomEvent的支持,请按照以下步骤的指导完成对接
1.在MediationInfo.java中增加新的AdNetwork的自定义id和name,其中name需要经过Base64加密;
2.在AdapterUtil.java中,添加AdNetwork的id和自定义CustomEvent的路径映射关系;
3.在ActLifecycle.java中添加新增AdNetwork的Activity包名路径,Activity路径需要经过Base64加密,如果存在多个Activity,仅需添加包名公共部分,无需每一个都添加。
1.在com.openmediation.sdk.mobileads目录下自定义xxxBanner,实现CustomBannerEvent,其中xxx为AdNetwork的name;
2.重写loadAd(Activity activity, Map<String, String> config)方法,在方法中实现AdNetWork广告的请求,请求前需要检测是否有初始化AdNetwork的SDK;
3.监听AdNetWork的广告生命周期事件,当收到广告加载成功时,通过 onInsReady(Object object) 方法通知到SDK,其中object为条幅广告的视图(view);
4.当收到广告加载失败时,通过 onInsError(String error) 方法通知到SDK;
5.当收到广告点击回调时,通过 onInsClicked() 方法通知到SDK;
6.重写destroy(Activity activity)方法,用以销毁AdNetwork的相关资源占用,释放内存;
7.重写getMediation()方法,返回值为int类型,值为之前定义的AdNetwork的id;
1.在com.openmediation.sdk.mobileads目录下自定义xxxNative,实现CustomNativeEvent,其中xxx为AdNetwork的name;
2.重写loadAd(Activity activity, Map<String, String> config)方法,在方法中实现AdNetWork广告的请求,请求前需要检测是否有初始化AdNetwork的SDK;
3.监听AdNetWork的广告生命周期事件,当收到广告加载成功时,通过 onInsReady(Object object) 方法通知到SDK,其中object为 com.openmediation.sdk.nativead.AdInfo 对象,需要将AdNetwork请求成功时得到的对象,通过以下几个方法转换成com.openmediation.sdk.nativead.AdInfo对象:
- CustomNativeEvent会自动创建一个com.openmediation.sdk.nativead.AdInfo全局对象;
- 通过setTitle(String title)方法获取AdNetwork的返回对象的title传递给AdInfo对象;
- 通过setDesc(String des)方法获取AdNetwork的返回对象的Description传递给AdInfo对象;
- 通过setCallToActionText(String callToActionText)方法获取AdNetwork的返回对象的callToActionText传递给AdInfo对象;
- 通过setType(int type)方法传入AdNetwork的Id给AdInfo对象
- 可选,如果AdNetwork返回对象中支持获取starRating,可通过setStarRarting(double startRating)方法传递给AdInfo对象;
- 最后将赋值后的AdInfo对象通过onInsReady(Object object)方法通知到SDK
4.当收到广告加载失败时,通过 onInsError(String error) 方法通知到SDK;
5.当收到广告点击回调时,通过 onInsClicked() 方法通知到SDK;
6.重写registerNativeView(NativeAdView adView)方法,用于渲染Native广告,NativeAdView提供了MediationView以及AdIconView,用于兼容各家AdNetwork的图片或者视频的渲染特殊性,以AdMob为例:
@Override
public void registerNativeView(NativeAdView adView) {
......
RelativeLayout relativeLayout = new RelativeLayout(adView.getContext());
if (mUnifiedNativeAd == null) {
return;
}
if (adView.getMediaView() != null) {
mMediaView = adView.getMediaView();
adView.setMediaView(mMediaView);
}
if (adView.getAdIconView() != null) {
mAdIconView = adView.getAdIconView();
adView.setAdIconView(mAdIconView);
}
mUnifiedNativeAdView = new UnifiedNativeAdView(adView.getContext());
if (adView.getTitleView() != null) {
mUnifiedNativeAdView.setHeadlineView(adView.getTitleView());
}
if (adView.getDescView() != null) {
mUnifiedNativeAdView.setBodyView(adView.getDescView());
}
if (adView.getCallToActionView() != null) {
mUnifiedNativeAdView.setCallToActionView(adView.getCallToActionView());
}
if (mMediaView != null) {
mMediaView.removeAllViews();
com.google.android.gms.ads.formats.MediaView admobMediaView = new
com.google.android.gms.ads.formats.MediaView(adView.getContext());
mMediaView.addView(admobMediaView);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
admobMediaView.setLayoutParams(layoutParams);
mUnifiedNativeAdView.setMediaView(admobMediaView);
}
if (mAdIconView != null && mUnifiedNativeAd.getIcon() != null && mUnifiedNativeAd.getIcon().getDrawable() != null) {
mAdIconView.removeAllViews();
ImageView iconImageView = new ImageView(adView.getContext());
mAdIconView.addView(iconImageView);
iconImageView.setImageDrawable(mUnifiedNativeAd.getIcon().getDrawable());
iconImageView.getLayoutParams().width = RelativeLayout.LayoutParams.MATCH_PARENT;
iconImageView.getLayoutParams().height = RelativeLayout.LayoutParams.MATCH_PARENT;
mUnifiedNativeAdView.setIconView(mAdIconView);
}
TextView textView = new TextView(adView.getContext());
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(50, 35);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
textView.setLayoutParams(layoutParams);
textView.setBackgroundColor(Color.argb(255, 234, 234, 234));
textView.setGravity(Gravity.CENTER);
textView.setText("Ad");
textView.setTextSize(10);
textView.setTextColor(Color.argb(255, 45, 174, 201));
relativeLayout.addView(textView);
mUnifiedNativeAdView.setAdvertiserView(textView);
int count = adView.getChildCount();
for (int a = 0; a < count; a++) {
View v = adView.getChildAt(a);
if (v == null || v instanceof UnifiedNativeAdView) {
continue;
}
adView.removeView(v);
relativeLayout.addView(v);
}
mUnifiedNativeAdView.setNativeAd(mUnifiedNativeAd);
textView.bringToFront();
if (mUnifiedNativeAdView.getAdChoicesView() != null) {
mUnifiedNativeAdView.getAdChoicesView().bringToFront();
}
adView.addView(mUnifiedNativeAdView);
int l = adView.getPaddingLeft();
int t = adView.getPaddingTop();
int r = adView.getPaddingRight();
int b = adView.getPaddingBottom();
relativeLayout.setPadding(l, t, r, b);
adView.setPadding(0, 0, 0, 0);
adView.addView(relativeLayout);
}
7.重写destroy(Activity activity)方法,用以销毁AdNetwork的相关资源占用,释放内存;
8.重写getMediation()方法,返回值为int类型,值为之前定义的AdNetwork的id;
插屏广告形式和激励视频广告形式存在很多的共通性,所以不需要像条幅广告和原生广告一样分开写CustomEvent,在SDK中,提供了二者公共的父类CustomAdsAdapter,只需要在com.openmediation.sdk.mobileads目录下自定义xxxAdapter,实现CustomAdsAdapter,其中xxx为AdNetWork的name,具体需要实现某一种广告形式,重写对应的api即可,但是都有几个共通api需要实现:
1.onResume(Activity activity),用以获取当前活跃状态的Activity;
2.onPause(Activity activity),通知Activity的暂停状态;
3.getMediationVersion(),返回AdNetwork的版本号;
4.getAdapterVersion(),给当前Adapter定义一个版本号,通过这个方法返回给SDK;
5.getAdNetworkId(),给AdNetWork定义一个Id,通过这个方法返回给SDK;
1.重写initInterstitialAd(Activity activity, Map<String, Object> dataMap, InterstitialAdCallback callback)方法,实现AdNetwork SDK的初始化;
2.重写loadInterstitialAd(Activity activity, String adUnitId, InterstitialAdCallback callback),实现AdNetwork的广告请求;
3.重写isInterstitialAdAvailable(String adUnitId),返回当前广告位的状态;
4.重写showInterstitialAd(Activity activity, String adUnitId, InterstitialAdCallback callback),展示AdNetwork 广告;
5.监听AdNetwork广告生命周期事件,以及通过InterstitialAdCallback通知SDK:
/**
* 当AdNetwork初始化成功时,通过这个回调方法通知SDK
*/
void onInterstitialAdInitSuccess();
/**
* 当AdNetwork初始化失败时,通过这个回调方法通知SDK
*
* @param error 初始化失败原因
*/
void onInterstitialAdInitFailed(String error);
/**
* 当AdNetwork广告关闭时,通过这个回调方法通知SDK
*/
void onInterstitialAdClosed();
/**
* 当AdNetwork加载成功时,通过这个回调方法通知SDK
*/
void onInterstitialAdLoadSuccess();
/**
* 当AdNetwork加载失败时,通过这个回调方法通知SDK
*
* @param error 加载失败原因
*/
void onInterstitialAdLoadFailed(String error);
/**
* 当AdNetwork展示成功时,通过这个回调方法通知SDK
*/
void onInterstitialAdShowSuccess();
/**
* 当AdNetwork展示失败时,通过这个回调方法通知SDK
*
* @param error 展示失败原因
*/
void onInterstitialAdShowFailed(String error);
/**
* 当AdNetwork广告点击时,通过这个回调方法通知SDK
*/
void onInterstitialAdClick();
1.重写initRewardedVideo(Activity activity, Map<String, Object> dataMap, RewardedVideoCallback callback)方法,实现AdNetwork SDK初始化;
2.重写loadRewardedVideo(Activity activity, String adUnitId, RewardedVideoCallback callback)方法,实现AdNetwork的广告加载;
3.重写isRewardedVideoAvailable(String adUnitId)方法,返回当前广告位的状态;
4.重写showRewardedVideo(Activity activity, String adUnitId, RewardedVideoCallback callback)方法,实现AdNetwork广告的展示;
5.监听AdNetwork广告生命周期事件,以及通过RewardedVideoCallback通知SDK:
/**
* 当AdNetwork初始化成功时,通过这个回调方法通知SDK
*/
void onRewardedVideoInitSuccess();
/**
* 当AdNetwork初始化失败时,通过这个回调方法通知SDK
*
* @param error 初始化失败原因
*/
void onRewardedVideoInitFailed(String error);
/**
* 当AdNetwork广告展示成功时,通过这个回调方法通知SDK
*/
void onRewardedVideoAdShowSuccess();
/**
* 当AdNetwork广告关闭时,通过这个回调方法通知SDK
*/
void onRewardedVideoAdClosed();
/**
* 当AdNetwork广告请求成功时,通过这个回调方法通知SDK
*/
void onRewardedVideoLoadSuccess();
/**
* 当AdNetwork广告请求失败时,通过这个回调方法通知SDK
*
* @param error 请求失败原因
*/
void onRewardedVideoLoadFailed(String error);
/**
* 当AdNetwork广告开始播放时,通过这个回调方法通知SDK
*/
void onRewardedVideoAdStarted();
/**
* 当AdNetwork广告播完完成时,通过这个回调方法通知SDK
*/
void onRewardedVideoAdEnded();
/**
* 当AdNetwork广告可以获得奖励时,通过这个回调方法通知SDK
*/
void onRewardedVideoAdRewarded();
/**
* 当AdNetwork广告展示失败时,通过这个回调方法通知SDK
*
* @param error 展示失败原因
*/
void onRewardedVideoAdShowFailed(String error);
/**
* 当AdNetwork广告点击时,通过这个回调方法通知SDK
*/
void onRewardedVideoAdClicked();
当AdNetwork提供Bid功能时,OpenMediation SDK同时也支持接入AdNetwork的Bid功能,目前SDK支持的有Facebook Bid,如需接入不在支持列表的AdNetwork的Bid功能,请按照以下的指导步骤完成接入。
1.在 BidAdapterUtil.java 文件中,添加AdNetwork的id和自定义CustomBidEvent的路径映射关系;
1.在com.openmediation.sdk.mobileads目录下自定义xxxBidAdapter,实现BidAdapter,其中xxx为AdNetWork的name;
2.重写executeBid(Context context, Map<String, Object> dataMap, BidCallback callback)方法,实现AdNetwork的竞价请求;
3.监听AdNetwork的Bid请求结果,通过BidCallback的bidSuccess(AdTimingBidResponse response)方法,通知SDK竞价请求成功,通过bidFailed(String error)方法通知SDK竞价请求失败,以Facebook为例:
private class FbBidResCallback implements FBAdBidRequest.BidResponseCallback {
private BidCallback mCallback;
FbBidResCallback(BidCallback callback) {
mCallback = callback;
}
@Override
public void handleBidResponse(FBAdBidResponse fbAdBidResponse) {
if (fbAdBidResponse == null) {
if (mCallback != null) {
mCallback.bidFailed("Facebook bid response return null");
}
return;
}
if (fbAdBidResponse.isSuccess()) {
mFbBidResponses.put(fbAdBidResponse.getPlacementId(), fbAdBidResponse);
AdTimingBidResponse response = new AdTimingBidResponse();
response.setOriginal(fbAdBidResponse.toString());
response.setCur(fbAdBidResponse.getCurrency());
response.setPrice(fbAdBidResponse.getPrice());
response.setPayLoad(fbAdBidResponse.getPayload());
if (mCallback != null) {
mCallback.bidSuccess(response);
}
} else {
if (fbAdBidResponse.getPlacementId() != null) {
mFbBidResponses.remove(fbAdBidResponse.getPlacementId());
}
if (mCallback != null) {
mCallback.bidFailed(fbAdBidResponse.getErrorMessage());
}
}
}
}
4.重写notifyWin(String placementId)方法,通知AdNetwork SDK竞价成功;
5.重写notifyLose(String placementId)方法,通知AdNetwork SDK竞价失败;