Developer技术博客 DevEngineer:林建有

广告模块详解mopub广告等

2021-06-04
林建有

广告模块(录屏应用)

模块名称:Adslibrary

广告平台和广告类型

  • 广告平台包含:AdmobFacebookVungleMopub中介

  • 广告类型:

    • Admob的接入的广告类型有:

      插屏广告InterstitialAd,开屏广告(AppOpenAd),

      激励广告RewardedAd,原生广告UnifiedNativeAd

    • Facebook接入的广告类型有:

      原生广告NativeAd,激励广告RewardedVideoAd

    • Vungle接入广告类型有:插屏广告

    • Mopub接入的广告类型有:原生广告NativeAd,激励广告MoPubReward,插屏广告MoPubInterstitial

广告模块架构

基础的广告类型加载和展示

类是放在basexxx目录下的,如下图。当钥匙用某个平台的广告是,就集成该类,然后实现对应的广告ID即可。

image-20210604174916370

广告渠道配比

渠道配比的控制基类是AdManagerBase.kt,具体继承实现可参考NativeForExportingHandler.kt类。

实现了某个渠道配比控制类后需要在AdTrafficControl.onInitAd里设置获取到的服务器渠道变量给控制类。然后可以开始加载广告。

AdTrafficControl.onInitAd(context: Context?, data: String?){
    ...
 		val exportingSuportAdChannelsList = getmShuffleAdResponse()!!.exportingSuportAdChannelsList
           if (exportingSuportAdChannelsList != null) {
            NativeForExportingHandler.INSTANCE
               .setAdChannel(exportingSuportAdChannelsList as MutableList<AdItem>?)
            NativeForExportingHandler.INSTANCE.initAd(context)
           }
    ...
}

AdTrafficControl.java是广告渠道配比请求和解析的类,需要传入预设的渠道参数配比传入请求参数里,才会返回渠道配比字段。

Mopub

mopub接入SDK依赖

dependencies {
// This will get the latest available version of the MoPub SDK.
// Alternatively, you may specify a specific version from the changelog to download.
    // For fullscreen ads
    api('com.mopub:mopub-sdk-fullscreen:+@aar') {
        transitive = true
    }
    // For native static (images).
    api('com.mopub:mopub-sdk-native-static:+@aar') {
        transitive = true
    }
}

mopub广告初始化

  • mopub 的激励广告需要传递Activity类型的context进行初始化,否则不会加载激励广告。
     public static void initMopub(Context context) {
            initMopub(context, null);
     }
	//mopub 的激励广告需要传递Activity类型的contex,初始化,否则不会加载激励广告
    public static void initMopub(Context context, @Nullable final SdkInitializationListener sdkInitializationListener) {
        Observable.just(1)
                .map(integer -> {
                    SdkConfiguration sdkConfiguration = new SdkConfiguration.Builder(MopubInterstitialForHome.HOME_AD_ID)
                            .withMediationSettings(new MediationSettings() {
                            })
//                            .withAdditionalNetworks(CustomAdapterConfiguration.class.getName())
//                            .withMediatedNetworkConfiguration(CustomAdapterConfiguration1.class.getName(), mediatedNetworkConfiguration)
//                            .withMediatedNetworkConfiguration(CustomAdapterConfiguration2.class.getName(), mediatedNetworkConfiguration)
//                            .withMediatedNetworkConfiguration(CustomAdapterConfiguration1.class.getName(), mediatedNetworkConfiguration1)
//                            .withMediatedNetworkConfiguration(CustomAdapterConfiguration2.class.getName(), mediatedNetworkConfiguration2)
                            .withLogLevel(MoPubLog.LogLevel.DEBUG)
                            .withLegitimateInterestAllowed(false)
                            .build();
                    MoPub.initializeSdk(context, sdkConfiguration, () -> {
                        /* MoPub SDK initialized.         
                        *Check if you should show the consent dialog here, and make your ad requests.
                        */
                        MyLog.e(" MoPub SDK initialized.");
                        if (sdkInitializationListener != null) {
                            sdkInitializationListener.onInitializationFinished();
                        }
                    });
                    return integer;
                })
                .subscribeOn(AndroidSchedulers.mainThread()).subscribe();
    }

Mopub加载广告和展示

mopub原生广告加载

    
    /**
     * UI thread
     */
    fun loadNativeAd(context: Context, layoutId: Int) {
        val viewBinder: ViewBinder = ViewBinder.Builder(layoutId)
                .mainImageId(R.id.native_ad_main_image)//big image大图片
                .iconImageId(R.id.native_ad_icon_image)//app icon
                .titleId(R.id.native_ad_title)//title变体
                .textId(R.id.native_ad_text)//描述
                .privacyInformationIconImageId(R.id.native_ad_privacy_information_icon_image)//广告来源信息
//                    .addExtra("sponsoredimage", R.id.sponsored_image) // If you display direct-sold native ads, you can add additional subviews for custom assets
                .build()
        loadNativeAd(context, viewBinder)

fun loadNativeAd(context: Context, viewBinder: ViewBinder) {

        if (moPubNative == null) {
            val placementId = getPlacementId()
            moPubNative = MoPubNative(context, placementId, object : MoPubNative.MoPubNativeNetworkListener {
                override fun onNativeLoad(nativeAd: NativeAd?) {
                    MyLog.e(getTAG() + " mopub:${placementId}  $nativeAd")
                    mNativeAd = nativeAd
                }

                override fun onNativeFail(errorCode: NativeErrorCode?) {
                    MyLog.e(getTAG() + " mopub:$placementId " + errorCode.toString())
                    mNativeAd = null
                }
            })
            val moPubStaticNativeAdRenderer = MoPubStaticNativeAdRenderer(viewBinder)
            moPubNative!!.registerAdRenderer(moPubStaticNativeAdRenderer)
        }
        val desiredAssets: EnumSet<RequestParameters.NativeAdAsset> = EnumSet.of(
                RequestParameters.NativeAdAsset.TITLE,
                RequestParameters.NativeAdAsset.TEXT,
                RequestParameters.NativeAdAsset.CALL_TO_ACTION_TEXT,
                RequestParameters.NativeAdAsset.MAIN_IMAGE,
                RequestParameters.NativeAdAsset.ICON_IMAGE,
                RequestParameters.NativeAdAsset.STAR_RATING
        )

        val mRequestParameters: RequestParameters = RequestParameters.Builder()
//                .location(exampleLocation)
//                .keywords(exampleKeywords)
                .desiredAssets(desiredAssets)
                .build()
        moPubNative!!.makeRequest(mRequestParameters)
    }

mopub 原生广告展示

  • 使用默认加载广告时定义的布局layoutIDViewBinder绑定的id时使用加载时的layoutID传入方法fun showAds(parent: ViewGroup, layoutId: Int)

  • 如果是使用了自定义的新布局的视图id绑定,则新建一个ViewBinder类指定id然后调用如下方法展示广告

    fun showAds(parent: ViewGroup, viewBinder: ViewBinder, isBigAdMaterial: Boolean)

 /**  
 * 在加载完后,手动更换视图绑定新的layout,不使用最初加载时设定的layout  
 * 默认样式的layout和ID  
 *  ViewBinder.Builder(layoutId)//  
 *  .mainImageId(R.id.native_ad_main_image)//大图片  
 *   .iconImageId(R.id.native_ad_icon_image)//app icon  
 *   .titleId(R.id.native_ad_title)//标题  
 *  .textId(R.id.native_ad_text)//描述  
 *  .privacyInformationIconImageId(R.id.native_ad_privacy_information_icon_image)//广告来源信息  
 *  //                    .addExtra("sponsoredimage", R.id.sponsored_image) 
 *	// If you display direct-sold native ads, you can add additional subviews for custom assets 
 *  .build()  
 */ 
fun showAds(parent: ViewGroup, layoutId: Int) { 
    val build = ViewBinder.Builder(layoutId)//  
    .mainImageId(R.id.native_ad_main_image)//大图片 
    .iconImageId(R.id.native_ad_icon_image)//app icon 
    .titleId(R.id.native_ad_title)//标题 
    .textId(R.id.native_ad_text)//描述  
    .privacyInformationIconImageId(R.id.native_ad_privacy_information_icon_image)//广告来源信息 
    //                    .addExtra("sponsoredimage", R.id.sponsored_image) 
    // If you display direct-sold native ads, you can add additional subviews for custom assets  
    .build()
    showAds(parent, build, false)
}

fun showAds(parent: ViewGroup, viewBinder: ViewBinder, isBigAdMaterial: Boolean) {
        val context = parent.context
        parent.removeAllViews()
        val staticNativeAd = mNativeAd!!.baseNativeAd as StaticNativeAd
        mNativeAd!!.setMoPubNativeEventListener(object : NativeAd.MoPubNativeEventListener {
            override fun onImpression(view: View?) {
                MyLog.e("onAdImpressed")
            }

            override fun onClick(view: View?) {
                MyLog.e("onAdClicked")
            }
        })
        mNativeAd!!.prepare(parent)//click event
        val moPubStaticNativeAdRenderer = MoPubStaticNativeAdRenderer(viewBinder)
        val createAdView = moPubStaticNativeAdRenderer.createAdView(context, parent)
        moPubStaticNativeAdRenderer.renderAdView(createAdView, staticNativeAd)
        parent.addView(createAdView)
        if (isBigAdMaterial) {
            parent.findViewById<FrameLayout>(R.id.ad_fl_preview_material_item)?.let {
                val itemWidth = (VideoEditorApplication.getPixels(context, true) - DensityTools.dp2px(context, 26f)) / 2
                val margin = DensityTools.dp2px(context, context.resources.getInteger(R.integer.material_grid_margin2).toFloat())
                val params = RelativeLayout.LayoutParams(itemWidth - margin * 2, itemWidth - margin * 2)
                it.layoutParams = params
            }
        }
        when (parent.visibility) {
            View.INVISIBLE,
            View.GONE -> {
                parent.visibility = View.VISIBLE
            }
        }
    }

mopub 插屏广告加载

详细代码看MopubInterstitialBase.kt

创建 MoPubInterstitial构造器时需要传入activity类型的context,所以需要在展示广告的界面临时加载


    /**
     * 创建 MoPubInterstitial构造器时需要传入activity类型的context
     */
    fun loadInterstitialAdAndShow(context: Activity, pageIndex: Int = -1, loadAndShow: Boolea){
        ...
    }

mopub插屏展示

调用如下方法展示

/**
*
*pageIndex 主页展示时需要的page index 逻辑
/
fun showInterstitialAd(context: Context, pageIndex: Int) {
       ...
   }

mopub激励广告

详情看RewardAdDialogFragment.java类型,该类集成了AdmobFacebookmopub三家平台的激励广告逻辑


Comments

Content