Android平臺Admob廣告接入和封裝,android接入廣告-ESG跨境

Android平臺Admob廣告接入和封裝,android接入廣告

來源網(wǎng)絡(luò)
來源網(wǎng)絡(luò)
2022-04-29
點(diǎn)贊icon 0
查看icon 1134

Android平臺Admob廣告接入和封裝,android接入廣告Android平臺Admob廣告接入和封裝前言關(guān)于Admob如何接入,官方文檔已經(jīng)寫的很清楚,所以不是本文的重點(diǎn)。本文主要講Admob的調(diào)用封裝。因?yàn)樽鳛殚_發(fā)者接入Admob之后,其實(shí)工作遠(yuǎn)沒有結(jié)束,可能想做預(yù)加載,想做些封裝讓接口更加簡潔友好,此外還想......

Android平臺Admob廣告接入和封裝,android接入廣告





Android平臺Admob廣告接入和封裝

前言

關(guān)于Admob如何接入,官方文檔已經(jīng)寫的很清楚,所以不是本文的重點(diǎn)。本文主要講Admob的調(diào)用封裝。因?yàn)樽鳛殚_發(fā)者接入Admob之后,其實(shí)工作遠(yuǎn)沒有結(jié)束,可能想做預(yù)加載,想做些封裝讓接口更加簡潔友好,此外還想讓業(yè)務(wù)代碼盡可能不與SDK耦合,等等。其實(shí)這部分內(nèi)容也是一個(gè)輪子,那我們就不要重復(fù)造輪子了。

Admob接入

1. 官方網(wǎng)站:https://developers.google.cn/admob/android/quickstart

官網(wǎng)文檔有中英文版本,閱讀上不是什么問題,實(shí)際接入難度不大。只是隨著版本的更新,文檔同步的不是很及時(shí)。

2. 官方開發(fā)論壇:https://groups.google.com/forum/#!forum/googleadmobadssdk

遇到一些問題可以到論壇搜索下。我在開發(fā)時(shí)遇到一個(gè)兼容性問題,某些手機(jī)上激勵(lì)廣告播放時(shí)會突然被強(qiáng)制關(guān)閉,后來就是在論壇上找到了解決方案:正在播放的激勵(lì)廣告需要有明確的引用持有,否則可能被系統(tǒng)回收導(dǎo)致廣告關(guān)閉。

二次封裝

完整代碼可以查看本文后面的github項(xiàng)目地址。

AdmobManager

框架內(nèi)唯一暴露給業(yè)務(wù)層的接口,是一個(gè)單例。業(yè)務(wù)層只需要跟它打交道就可以進(jìn)行加載、獲取、顯示廣告等操作。

NativeAdRepository

原生高級廣告?zhèn)}庫,一個(gè)廣告位id對應(yīng)一個(gè)廣告?zhèn)}庫。本質(zhì)是一個(gè)廣告池,可實(shí)現(xiàn)給定數(shù)量的廣告預(yù)加載,并在廣告被使用后自動進(jìn)行個(gè)數(shù)的加載補(bǔ)足。

/**

* 一個(gè)id對應(yīng)一個(gè)廣告?zhèn)}庫,倉庫會自動進(jìn)行廣告的預(yù)加載(個(gè)數(shù)preloadCount),并向外提供廣告內(nèi)容

*

* id默認(rèn)是測試廣告

*/

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

                  private var preloadCount: Int = 1) {

  /**

  * 已加載的廣告列表

  */

  var adList = LinkedListUnifiedNativeAd()

  /**

  * 是否正在進(jìn)行廣告加載

  */

  var isLoading = false

  /**

  * 正在加載的廣告?zhèn)€數(shù)

  */

  var loadingCount = 0

  var loadListenerList = ArrayListNativeAdLoadListener()

  /**

  * 進(jìn)行廣告加載

  */

  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)

  }

  /**

  * 一個(gè)廣告加載完成時(shí)調(diào)用

  */

  private fun onAdLoaded() {

    //更新正在加載的廣告?zhèn)€數(shù)

    loadingCount

    //所有廣告加載完成,狀態(tài)更新成未在加載中

    if (loadingCount = 0) {

      isLoading = false

      //一般廣告加載成功,收到一次通知即可,所以將所有監(jiān)聽器在這里進(jìn)行移除

      if(adList.size  0) {

        loadListenerList.clear()

      }

    }

  }

  /**

  * 是否已經(jīng)有廣告加載完成

  */

  fun isReady(context: Context): Boolean {

    return adList.isNotEmpty()

  }

  /**

  * 獲取加載好的原生廣告

  */

  fun getAd(context: Context): UnifiedNativeAd  {

    var ad = adList.poll()

    //廣告被取走后,需要重新加載廣告,保證池子里面有一定數(shù)量的預(yù)加載廣告

    loadAds(context)

    return ad

  }

  /**

  * 設(shè)置預(yù)加載個(gè)數(shù)

  */

  fun setPreloadCount(value: Int) {

    preloadCount = value

  }

  /**

  * 添加廣告加載監(jiān)聽器。注意:監(jiān)聽器會在廣告的一輪加載成功后被全部移除。

  */

  fun addLoadListener(listener: NativeAdLoadListener) {

    if (!loadListenerList.contains(listener)) {

      loadListenerList.add(listener)

    }

  }

  /**

  * 移除廣告加載監(jiān)聽器

  */

  fun removeLoadListener(listener: NativeAdLoadListener) {

    loadListenerList.remove(listener)

  }

}

RewardAdRepository

激勵(lì)廣告?zhèn)}庫,一個(gè)廣告位id對應(yīng)一個(gè)廣告參考,實(shí)現(xiàn)方式與原生高級廣告基本一致。

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

                  private var preloadCount: Int = 1) {

  /**

  * 是否正在加載

  */

  var isLoading = false

  var adList = ArrayListRewardedAd()

  /**

  * 正在加載的廣告?zhèn)€數(shù)

  */

  var loadingCount = 0

  /**

  * 正在播放的廣告需要有明確的引用持有,否則在有些系統(tǒng)里面廣告會被強(qiáng)制回收關(guān)閉

  */

  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

      //一般廣告加載成功,收到一次通知即可,所以將所有監(jiān)聽器在這里進(jìn)行移除

      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)

    }

  }

  /**

  * 是否有加載完成的激勵(lì)廣告

  */

  fun isReady(context: Context): Boolean {

    for(rewardAd in adList) {

      if (rewardAd.isLoaded) {

        return true

      }

    }

    return false

  }

  /**

  * 顯示激勵(lì)廣告

  */

  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)

          }

        })

      }

    }

  }

  /**

  * 設(shè)置預(yù)加載個(gè)數(shù)

  */

  fun setPreloadCount(value: Int) {

    preloadCount = value

  }

  /**

  * 添加廣告加載監(jiān)聽器。注意:監(jiān)聽器會在廣告的一輪加載成功后被全部移除。

  */

  fun addLoadListener(listener: RewardAdLoadListener) {

    if (!loadListenerList.contains(listener)) {

      loadListenerList.add(listener)

    }

  }

  /**

  * 移除廣告加載監(jiān)聽器

  */

  fun removeLoadListener(listener: RewardAdLoadListener) {

    loadListenerList.remove(listener)

  }

}

Demo

項(xiàng)目地址:https://github.com/CoddZhang/AdmobDemo

包含:

1. 對SDK調(diào)用的封裝代碼

2. 使用測試id實(shí)現(xiàn)激勵(lì)廣告和原生高級廣告。

寫在最后

Admob其實(shí)是被Google收購的,并非土著的Google開發(fā)團(tuán)隊(duì)作品,所以SDK的設(shè)計(jì)水準(zhǔn)感覺一般,友好性和自由度上做的不太好,不夠賞心悅目。


文章推薦
Azure 網(wǎng)絡(luò)觀察程序是什么,azure信息保護(hù)查看器的作用
android個(gè)人開發(fā)者接廣告admob以及需要注意的錯(cuò)誤細(xì)節(jié),android中添加adb
Google ads預(yù)算有限,google ads 行業(yè)分析
Google Gmail使用的10個(gè)技巧,google和gmail用不了


特別聲明:以上文章內(nèi)容僅代表作者本人觀點(diǎn),不代表ESG跨境電商觀點(diǎn)或立場。如有關(guān)于作品內(nèi)容、版權(quán)或其它問題請于作品發(fā)表后的30日內(nèi)與ESG跨境電商聯(lián)系。

搜索 放大鏡
韓國平臺交流群
加入
韓國平臺交流群
掃碼進(jìn)群
歐洲多平臺交流群
加入
歐洲多平臺交流群
掃碼進(jìn)群
美國賣家交流群
加入
美國賣家交流群
掃碼進(jìn)群
ESG跨境專屬福利分享群
加入
ESG跨境專屬福利分享群
掃碼進(jìn)群
拉美電商交流群
加入
拉美電商交流群
掃碼進(jìn)群
亞馬遜跨境增長交流群
加入
亞馬遜跨境增長交流群
掃碼進(jìn)群
亞馬遜跨境增長交流群
加入
亞馬遜跨境增長交流群
掃碼進(jìn)群
拉美電商交流群
加入
拉美電商交流群
掃碼進(jìn)群
ESG獨(dú)家招商-PHH GROUP賣家交流群
加入
ESG獨(dú)家招商-PHH GROUP賣家交流群
掃碼進(jìn)群
《TikTok官方運(yùn)營干貨合集》
《TikTok綜合運(yùn)營手冊》
《TikTok短視頻運(yùn)營手冊》
《TikTok直播運(yùn)營手冊》
《TikTok全球趨勢報(bào)告》
《韓國節(jié)日營銷指南》
《開店大全-全球合集》
《開店大全-主流平臺篇》
《開店大全-東南亞篇》
《CD平臺自注冊指南》
通過ESG入駐平臺,您將解鎖
綠色通道,更高的入駐成功率
專業(yè)1v1客戶經(jīng)理服務(wù)
運(yùn)營實(shí)操指導(dǎo)
運(yùn)營提效資源福利
平臺官方專屬優(yōu)惠

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

訂閱
聯(lián)系顧問

平臺顧問

平臺顧問 平臺顧問

微信掃一掃
馬上聯(lián)系在線顧問

icon icon

小程序

微信小程序

ESG跨境小程序
手機(jī)入駐更便捷

icon icon

返回頂部

【免費(fèi)領(lǐng)取】全球跨境電商運(yùn)營干貨 關(guān)閉