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

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

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

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í)會(huì)突然被強(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ù)加載,并在廣告被使用后自動(dòng)進(jìn)行個(gè)數(shù)的加載補(bǔ)足。

/**

* 一個(gè)id對應(yīng)一個(gè)廣告?zhèn)}庫,倉庫會(huì)自動(dòng)進(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)聽器會(huì)在廣告的一輪加載成功后被全部移除。

  */

  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)里面廣告會(huì)被強(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)聽器會(huì)在廣告的一輪加載成功后被全部移除。

  */

  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)群
《波蘭allegro知識百科》
《Darty知識百科》
《法國Fnac知識百科》
《PEAKS 出海經(jīng)營方法論白皮書》
2025跨境電商營銷日歷
《2024年全球消費(fèi)趨勢白皮書——美國篇》
《2024TikTok出海達(dá)人營銷白皮書》
《Coupang自注冊指南》
《eMAG知識百科》
《TikTok官方運(yùn)營干貨合集》
通過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)閉
進(jìn)行中
進(jìn)行中
【平臺干貨】eMAG知識百科
涵蓋從開店到大賣6個(gè)板塊:開店、運(yùn)營、廣告、選品、上架、物流
免費(fèi)領(lǐng)取
進(jìn)行中
進(jìn)行中
TikTok運(yùn)營必備干貨包
包含8個(gè)TikTok最新運(yùn)營指南(市場趨勢、運(yùn)營手冊、節(jié)日攻略等),官方出品,專業(yè)全面!
免費(fèi)領(lǐng)取
進(jìn)行中
進(jìn)行中
韓國coupang平臺自注冊指南
韓國Coupang電商平臺從注冊準(zhǔn)備、提交申請到完成注冊,開店全流程詳細(xì)指引。
免費(fèi)領(lǐng)取
進(jìn)行中
進(jìn)行中
全球平臺詳解——全球合集
涵括全球100+個(gè)電商平臺的核心信息,包括平臺精煉簡介、競爭優(yōu)勢、熱銷品類、入駐要求以及入駐須知等關(guān)鍵內(nèi)容。
立即領(lǐng)取
進(jìn)行中
進(jìn)行中
韓國電商節(jié)日營銷指南
10+韓國電商重要營銷節(jié)點(diǎn)詳細(xì)解讀;2024各節(jié)日熱度選品助力引爆訂單增長;8大節(jié)日營銷技巧輕松撬動(dòng)大促流量密碼。
免費(fèi)領(lǐng)取
進(jìn)行中
進(jìn)行中
2025跨境電商營銷日歷
包括傳統(tǒng)中、外重要節(jié)日及重點(diǎn)電商營銷節(jié)點(diǎn)還對營銷關(guān)鍵市場、選品輔以說明,讓你的365天安排的明明白白!
免費(fèi)領(lǐng)取
進(jìn)行中
進(jìn)行中
全球平臺詳解——?dú)W洲篇
涵蓋20+歐洲電商平臺,詳細(xì)解讀優(yōu)勢、入駐條件、熱銷品等
立即領(lǐng)取