Android平臺(tái)Admob廣告接入和封裝,android程序化廣告詳細(xì)流程-ESG跨境

Android平臺(tái)Admob廣告接入和封裝,android程序化廣告詳細(xì)流程

來(lái)源網(wǎng)絡(luò)
來(lái)源網(wǎng)絡(luò)
2022-07-05
點(diǎn)贊icon 0
查看icon 718

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

Android平臺(tái)Admob廣告接入和封裝,android程序化廣告詳細(xì)流程




Android平臺(tái)Admob廣告接入和封裝

前言

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

Admob接入

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

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

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

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

二次封裝

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

AdmobManager

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

NativeAdRepository

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

/**

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

*

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

*/

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)}庫(kù),一個(gè)廣告位id對(duì)應(yīng)一個(gè)廣告參考,實(shí)現(xiàn)方式與原生高級(jí)廣告基本一致。

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

    }

    //用來(lái)放沒(méi)有加載成功的廣告

    var removeList = ArrayListRewardedAd()

    for (rewardAd in adList) {

      //沒(méi)加載成功的廣告就丟到待刪除列表里

      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. 對(duì)SDK調(diào)用的封裝代碼

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

寫在最后

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


文章推薦
AWS、谷歌、微軟,亞馬遜aws研發(fā)云計(jì)算
Google Play 免安裝體驗(yàn)概覽,小米啟用google play服務(wù)
FANMAUM通過(guò)Tapjoy將OFFERWALL收入提高了50%
Google Ads的工作原理,google play 服務(wù)是干什么的


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

搜索 放大鏡
韓國(guó)平臺(tái)交流群
加入
韓國(guó)平臺(tái)交流群
掃碼進(jìn)群
歐洲多平臺(tái)交流群
加入
歐洲多平臺(tái)交流群
掃碼進(jìn)群
美國(guó)賣家交流群
加入
美國(guó)賣家交流群
掃碼進(jìn)群
ESG跨境專屬福利分享群
加入
ESG跨境專屬福利分享群
掃碼進(jìn)群
拉美電商交流群
加入
拉美電商交流群
掃碼進(jìn)群
亞馬遜跨境增長(zhǎng)交流群
加入
亞馬遜跨境增長(zhǎng)交流群
掃碼進(jìn)群
亞馬遜跨境增長(zhǎng)交流群
加入
亞馬遜跨境增長(zhǎng)交流群
掃碼進(jìn)群
拉美電商交流群
加入
拉美電商交流群
掃碼進(jìn)群
ESG獨(dú)家招商-PHH GROUP賣家交流群
加入
ESG獨(dú)家招商-PHH GROUP賣家交流群
掃碼進(jìn)群
2025跨境電商營(yíng)銷日歷
《2024年全球消費(fèi)趨勢(shì)白皮書——美國(guó)篇》
《2024TikTok出海達(dá)人營(yíng)銷白皮書》
《Coupang自注冊(cè)指南》
《eMAG知識(shí)百科》
《TikTok官方運(yùn)營(yíng)干貨合集》
《韓國(guó)節(jié)日營(yíng)銷指南》
《開店大全-全球合集》
《TikTok綜合運(yùn)營(yíng)手冊(cè)》
《TikTok短視頻運(yùn)營(yíng)手冊(cè)》
通過(guò)ESG入駐平臺(tái),您將解鎖
綠色通道,更高的入駐成功率
專業(yè)1v1客戶經(jīng)理服務(wù)
運(yùn)營(yíng)實(shí)操指導(dǎo)
運(yùn)營(yíng)提效資源福利
平臺(tái)官方專屬優(yōu)惠

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

訂閱
聯(lián)系顧問(wèn)

平臺(tái)顧問(wèn)

平臺(tái)顧問(wèn) 平臺(tái)顧問(wèn)

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

icon icon

小程序

微信小程序

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

icon icon

返回頂部

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