影音先锋男人资源站_国产婷婷综合丁香亚洲欧洲_白狐视频传媒污软件下载_趁女同学午休揉她的屁股

Android平臺Admob廣告接入和封裝,android程序化廣告詳細流程-ESG跨境

Android平臺Admob廣告接入和封裝,android程序化廣告詳細流程

來源網絡
來源網絡
2022-07-05
點贊icon 0
查看icon 712

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跨境專屬福利分享群
掃碼進群
拉美電商交流群
加入
拉美電商交流群
掃碼進群
亞馬遜跨境增長交流群
加入
亞馬遜跨境增長交流群
掃碼進群
亞馬遜跨境增長交流群
加入
亞馬遜跨境增長交流群
掃碼進群
拉美電商交流群
加入
拉美電商交流群
掃碼進群
ESG獨家招商-PHH GROUP賣家交流群
加入
ESG獨家招商-PHH GROUP賣家交流群
掃碼進群
2025跨境電商營銷日歷
《2024年全球消費趨勢白皮書——美國篇》
《2024TikTok出海達人營銷白皮書》
《Coupang自注冊指南》
《eMAG知識百科》
《TikTok官方運營干貨合集》
《韓國節日營銷指南》
《開店大全-全球合集》
《TikTok綜合運營手冊》
《TikTok短視頻運營手冊》
通過ESG入駐平臺,您將解鎖
綠色通道,更高的入駐成功率
專業1v1客戶經理服務
運營實操指導
運營提效資源福利
平臺官方專屬優惠

立即登記,定期獲得更多資訊

訂閱
聯系顧問

平臺顧問

平臺顧問 平臺顧問

微信掃一掃
馬上聯系在線顧問

icon icon

小程序

微信小程序

ESG跨境小程序
手機入駐更便捷

icon icon

返回頂部