目录

广告模块详解mopub广告等

  • content {:toc}

广告模块(录屏应用)

模块名称:Adslibrary

广告平台和广告类型

  • 广告平台包含:AdmobFacebookVungleMopub中介
  • 广告类型:
  • Admob的接入的广告类型有: 插屏广告InterstitialAd,开屏广告(AppOpenAd), 激励广告RewardedAd,原生广告UnifiedNativeAd
  • Facebook接入的广告类型有: 原生广告NativeAd,激励广告RewardedVideoAd
  • Vungle接入广告类型有:插屏广告
  • Mopub接入的广告类型有:原生广告NativeAd,激励广告MoPubReward,插屏广告MoPubInterstitial

广告模块架构

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

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

广告渠道配比

渠道配比的控制基类是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?)
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 = 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(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三家平台的激励广告逻辑