Skip to content

Android CustomEvent

AdTiming edited this page Apr 3, 2020 · 1 revision

Android CustomEvent

OpenMediation SDK支持自定义接入AdNetwork,通过给不在我们支持列表中的AdNetwork实现CustomEvent,使其能被SDK聚合。

免责声明:我们不鼓励使用不受支持的网络适配器,并且不对由于使用它们而引起的问题提供测试或技术支持。

当前支持的AdNetwork

	AdTiming;
	AdMob;
	Facebook;
	Unity;
	Vungle;
	AdColony;
	AppLovin;
	MoPub;
	Tapjoy;
	Chartboost;
	Mintegral;

为了实现对CustomEvent的支持,请按照以下步骤的指导完成对接

SDK更新

1.在MediationInfo.java中增加新的AdNetwork的自定义id和name,其中name需要经过Base64加密;

2.在AdapterUtil.java中,添加AdNetwork的id和自定义CustomEvent的路径映射关系;

3.在ActLifecycle.java中添加新增AdNetwork的Activity包名路径,Activity路径需要经过Base64加密,如果存在多个Activity,仅需添加包名公共部分,无需每一个都添加。

CustomEvent实现

横幅广告

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();

HeaderBidding CustomEvent

当AdNetwork提供Bid功能时,OpenMediation SDK同时也支持接入AdNetwork的Bid功能,目前SDK支持的有Facebook Bid,如需接入不在支持列表的AdNetwork的Bid功能,请按照以下的指导步骤完成接入。

SDK更新

1.在 BidAdapterUtil.java 文件中,添加AdNetwork的id和自定义CustomBidEvent的路径映射关系;

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竞价失败;

End

Clone this wiki locally