Android平台Admob广告接入和封装,android程序化广告详细流程-ESG跨境

Android平台Admob广告接入和封装,android程序化广告详细流程

来源网络
来源网络
2022-07-05
点赞icon 0
查看icon 574

Android平台Admob广告接入和封装,android程序化广告详细流程Android平台Admob广告接入和封装前言关于Admob如何接入,官方文档已经写的很清楚,所以不是本文的重点。本文主要讲Admob的调用封装。因为作为开发者接入Admob之后,其实工作远没有结束,可能想做预加载,想做些封装让接口更加简洁友好......

Android平台Admob广告接入和封装,android程序化广告详细流程




Android平台Admob广告接入和封装

前言

关于Admob如何接入,官方文档已经写的很清楚,所以不是本文的重点。本文主要讲Admob的调用封装。因为作为开发者接入Admob之后,其实工作远没有结束,可能想做预加载,想做些封装让接口更加简洁友好,此外还想让业务代码尽可能不与SDK耦合,等等。其实这部分内容也是一个轮子,那我们就不要重复造轮子了。

Admob接入

1. 官方网站:https://developers.google.cn/admob/android/quickstart

官网文档有中英文版本,阅读上不是什么问题,实际接入难度不大。只是随着版本的更新,文档同步的不是很及时。

2. 官方开发论坛:https://groups.google.com/forum/#!forum/googleadmobadssdk

遇到一些问题可以到论坛搜索下。我在开发时遇到一个兼容性问题,某些手机上激励广告播放时会突然被强制关闭,后来就是在论坛上找到了解决方案:正在播放的激励广告需要有明确的引用持有,否则可能被系统回收导致广告关闭。

二次封装

完整代码可以查看本文后面的github项目地址。

AdmobManager

框架内唯一暴露给业务层的接口,是一个单例。业务层只需要跟它打交道就可以进行加载、获取、显示广告等操作。

NativeAdRepository

原生高级广告仓库,一个广告位id对应一个广告仓库。本质是一个广告池,可实现给定数量的广告预加载,并在广告被使用后自动进行个数的加载补足。

/**

* 一个id对应一个广告仓库,仓库会自动进行广告的预加载(个数preloadCount),并向外提供广告内容

*

* id默认是测试广告

*/

class NativeAdRepository constructor(private var id: String = caapppub3940256099942544/2247696110,

                  private var preloadCount: Int = 1) {

  /**

  * 已加载的广告列表

  */

  var adList = LinkedListUnifiedNativeAd()

  /**

  * 是否正在进行广告加载

  */

  var isLoading = false

  /**

  * 正在加载的广告个数

  */

  var loadingCount = 0

  var loadListenerList = ArrayListNativeAdLoadListener()

  /**

  * 进行广告加载

  */

  fun loadAds(context: Context) {

    if (isLoading adList.size = preloadCount) {

      Log.w(AdmobManager.TAG, $id NativeAd dont need load)

      return

    }

    isLoading = true //开始加载

    val request = AdRequest.Builder().build()

    val adLoader = AdLoader.Builder(context, id).forUnifiedNativeAd {//广告加载完成

      adList.offer(it)

      for(listener in loadListenerList) {

        listener.onLoaded()

      }

      onAdLoaded()

    }.withAdListener(object : AdListener() {

      override fun onAdFailedToLoad(errorCode: Int) {

        onAdLoaded()

        Log.w(AdmobManager.TAG, $id NativeAd load failed, errorCode = $errorCode)

      }

    }).build()

    //开始加载

    loadingCount = preloadCount adList.size

    adLoader.loadAds(request, loadingCount)

  }

  /**

  * 一个广告加载完成时调用

  */

  private fun onAdLoaded() {

    //更新正在加载的广告个数

    loadingCount

    //所有广告加载完成,状态更新成未在加载中

    if (loadingCount = 0) {

      isLoading = false

      //一般广告加载成功,收到一次通知即可,所以将所有监听器在这里进行移除

      if(adList.size  0) {

        loadListenerList.clear()

      }

    }

  }

  /**

  * 是否已经有广告加载完成

  */

  fun isReady(context: Context): Boolean {

    return adList.isNotEmpty()

  }

  /**

  * 获取加载好的原生广告

  */

  fun getAd(context: Context): UnifiedNativeAd  {

    var ad = adList.poll()

    //广告被取走后,需要重新加载广告,保证池子里面有一定数量的预加载广告

    loadAds(context)

    return ad

  }

  /**

  * 设置预加载个数

  */

  fun setPreloadCount(value: Int) {

    preloadCount = value

  }

  /**

  * 添加广告加载监听器。注意:监听器会在广告的一轮加载成功后被全部移除。

  */

  fun addLoadListener(listener: NativeAdLoadListener) {

    if (!loadListenerList.contains(listener)) {

      loadListenerList.add(listener)

    }

  }

  /**

  * 移除广告加载监听器

  */

  fun removeLoadListener(listener: NativeAdLoadListener) {

    loadListenerList.remove(listener)

  }

}

RewardAdRepository

激励广告仓库,一个广告位id对应一个广告参考,实现方式与原生高级广告基本一致。

class RewardAdRepository constructor(private var id: String = caapppub3940256099942544/5224354917,

                  private var preloadCount: Int = 1) {

  /**

  * 是否正在加载

  */

  var isLoading = false

  var adList = ArrayListRewardedAd()

  /**

  * 正在加载的广告个数

  */

  var loadingCount = 0

  /**

  * 正在播放的广告需要有明确的引用持有,否则在有些系统里面广告会被强制回收关闭

  */

  var rewardedAdShowing: RewardedAd? = null

  var loadListenerList = ArrayListRewardAdLoadListener()

  val rewardAdLoaderCallback = object : RewardedAdLoadCallback() {

    override fun onRewardedAdLoaded() {

      Log.i(AdmobManager.TAG, $id Reward Ad loaded)

      for(listener in loadListenerList) {

        listener.onLoaded()

      }

      onAdLoaded()

    }

    override fun onRewardedAdFailedToLoad(var1: Int) {

      Log.e(AdmobManager.TAG, $id Reward Ad load failed, errorCode = $var1)

      onAdLoaded()

    }

  }

  private fun onAdLoaded() {

    loadingCount

    if (loadingCount = 0) {

      isLoading = false

      //一般广告加载成功,收到一次通知即可,所以将所有监听器在这里进行移除

      if(adList.size  0) {

        loadListenerList.clear()

      }

    }

  }

  /**

  * 加载广告

  */

  fun loadAds(context: Context) {

    if (isLoading) {

      return

    }

    //用来放没有加载成功的广告

    var removeList = ArrayListRewardedAd()

    for (rewardAd in adList) {

      //没加载成功的广告就丢到待删除列表里

      if (!rewardAd.isLoaded) {

        removeList.add(rewardAd)

      }

    }

    adList.removeAll(removeList)

    loadingCount = preloadCount adList.size

    val request = AdRequest.Builder().build()

    while (adList.size  preloadCount) {

      var rewardedAd = RewardedAd(context, id)

      adList.add(rewardedAd)

      rewardedAd.loadAd(request, rewardAdLoaderCallback)

      isLoading = true

      Log.i(AdmobManager.TAG, $id Reward Ad loading)

    }

  }

  /**

  * 是否有加载完成的激励广告

  */

  fun isReady(context: Context): Boolean {

    for(rewardAd in adList) {

      if (rewardAd.isLoaded) {

        return true

      }

    }

    return false

  }

  /**

  * 显示激励广告

  */

  fun show(activity: Activity, listener: RewardAdShowListener?) {

    for(rewardAd in adList) {

      if (rewardAd.isLoaded) {

        Log.i(AdmobManager.TAG, $id Reward Ad show)

        rewardedAdShowing = rewardAd

        rewardAd.show(activity, object : RewardedAdCallback() {

          override fun onRewardedAdOpened() {

            listener?.onShowed()

          }

          override fun onRewardedAdClosed() {

            listener?.onClosed()

            rewardedAdShowing = null

          }

          override fun onUserEarnedReward(@NonNull var1: RewardItem) {

            listener?.onEarned()

          }

          override fun onRewardedAdFailedToShow(var1: Int) {

            listener?.onShowFailed(var1)

          }

        })

      }

    }

  }

  /**

  * 设置预加载个数

  */

  fun setPreloadCount(value: Int) {

    preloadCount = value

  }

  /**

  * 添加广告加载监听器。注意:监听器会在广告的一轮加载成功后被全部移除。

  */

  fun addLoadListener(listener: RewardAdLoadListener) {

    if (!loadListenerList.contains(listener)) {

      loadListenerList.add(listener)

    }

  }

  /**

  * 移除广告加载监听器

  */

  fun removeLoadListener(listener: RewardAdLoadListener) {

    loadListenerList.remove(listener)

  }

}

Demo

项目地址:https://github.com/CoddZhang/AdmobDemo

包含:

1. 对SDK调用的封装代码

2. 使用测试id实现激励广告和原生高级广告。

写在最后

Admob其实是被Google收购的,并非土著的Google开发团队作品,所以SDK的设计水准感觉一般,友好性和自由度上做的不太好,不够赏心悦目。


文章推荐
AWS、谷歌、微软,亚马逊aws研发云计算
Google Play 免安装体验概览,小米启用google play服务
FANMAUM通过Tapjoy将OFFERWALL收入提高了50%
Google Ads的工作原理,google play 服务是干什么的


特别声明:以上文章内容仅代表作者本人观点,不代表ESG跨境电商观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与ESG跨境电商联系。

搜索 放大镜
韩国平台交流群
加入
韩国平台交流群
扫码进群
欧洲多平台交流群
加入
欧洲多平台交流群
扫码进群
美国卖家交流群
加入
美国卖家交流群
扫码进群
ESG跨境专属福利分享群
加入
ESG跨境专属福利分享群
扫码进群
拉美电商交流群
加入
拉美电商交流群
扫码进群
亚马逊跨境增长交流群
加入
亚马逊跨境增长交流群
扫码进群
《开店大全-全球合集》
《开店大全-主流平台篇》
《开店大全-东南亚篇》
《CD平台自注册指南》
《开店大全-俄罗斯篇》
《韩国站内推广指南》
《韩国热销品预测》
《开店大全-日韩篇》
《开店大全-拉美篇》
《开店大全-欧洲篇》
通过ESG入驻平台,您将解锁
绿色通道,更高的入驻成功率
专业1v1客户经理服务
运营实操指导
运营提效资源福利
平台官方专属优惠
联系顾问

平台顾问

平台顾问 平台顾问

微信扫一扫
马上联系在线顾问

icon icon

小程序

微信小程序

ESG跨境小程序
手机入驻更便捷

icon icon

返回顶部