Android?Admob接入原理及完整教程示例
添加Admob SDK
最近公司的項(xiàng)目新接入了Admob廣告SDK,本文介紹下Admob插屏、激勵(lì)視頻、Banner等三種廣告的接入方法。
(1)在app module下的build.gradle中添加代碼,如下:
dependencies { implementation 'com.google.android.gms:play-services-ads:21.4.0' }
(2)在AndroidManifest中添加代碼,如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <application> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/> </application> </manifest>
初始化SDK
通過(guò)MobileAds
的initialize
方法進(jìn)行初始化,代碼如下:
class AdmobExampleActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MobileAds.initialize(this, object : OnInitializationCompleteListener { override fun onInitializationComplete(initializationStatus: InitializationStatus) { val readyAdapter = initializationStatus.adapterStatusMap.entries.find { // 判斷適配器初始化的狀態(tài) // 準(zhǔn)備就緒 AdapterStatus.State.READY // 沒(méi)準(zhǔn)備好 AdapterStatus.State.NOT_READY it.value.initializationState == AdapterStatus.State.READY } // 有任意一種適配器初始化成功就可以開(kāi)始加載廣告 if (readyAdapter != null) { // 適配器的名稱 val adapterName = readyAdapter.key } } }) } }
插屏廣告
插屏廣告的加載、展示等代碼如下:
class AdmobExampleActivity : AppCompatActivity() { private lateinit var binding: LayoutAdmobExampleActivityBinding private var interstitialAd: InterstitialAd? = null // 插屏廣告加載狀態(tài)的回調(diào) private val interstitialAdLoadCallback = object : InterstitialAdLoadCallback() { override fun onAdLoaded(interstitialAd: InterstitialAd) { super.onAdLoaded(interstitialAd) // 加載成功 this@AdmobExampleActivity.interstitialAd = interstitialAd // 設(shè)置廣告事件回調(diào) this@AdmobExampleActivity.interstitialAd?.fullScreenContentCallback = interstitialAdCallback // 顯示插屏廣告 this@AdmobExampleActivity.interstitialAd?.show(this@AdmobExampleActivity) } override fun onAdFailedToLoad(loadAdError: LoadAdError) { super.onAdFailedToLoad(loadAdError) // 加載失敗 } } // 插屏廣告相關(guān)事件回調(diào) private val interstitialAdCallback = object : FullScreenContentCallback() { override fun onAdImpression() { super.onAdImpression() // 被記錄為展示成功時(shí)調(diào)用 } override fun onAdShowedFullScreenContent() { super.onAdShowedFullScreenContent() // 顯示時(shí)調(diào)用 } override fun onAdClicked() { super.onAdClicked() // 被點(diǎn)擊時(shí)調(diào)用 } override fun onAdDismissedFullScreenContent() { super.onAdDismissedFullScreenContent() // 隱藏時(shí)調(diào)用,此時(shí)銷毀當(dāng)前的插屏廣告對(duì)象,重新加載插屏廣告 interstitialAd = null loadInterstitialAd() } override fun onAdFailedToShowFullScreenContent(adError: AdError) { super.onAdFailedToShowFullScreenContent(adError) // 展示失敗時(shí)調(diào)用,此時(shí)銷毀當(dāng)前的插屏廣告對(duì)象,重新加載插屏廣告 interstitialAd = null loadInterstitialAd() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MobileAds.initialize(this, object : OnInitializationCompleteListener { override fun onInitializationComplete(initializationStatus: InitializationStatus) { ... loadInterstitialAd() } }) } private fun loadInterstitialAd() { // adUnitId為Admob后臺(tái)創(chuàng)建的插屏廣告的id InterstitialAd.load(this, "adUnitId", AdRequest.Builder().build(), interstitialAdLoadCallback) } }
激勵(lì)視頻廣告
激勵(lì)視頻廣告的加載、展示等代碼如下:
class AdmobExampleActivity : AppCompatActivity() { private lateinit var binding: LayoutAdmobExampleActivityBinding private var rewardedAd: RewardedAd? = null private val rewardedAdLoadCallback = object : RewardedAdLoadCallback() { override fun onAdLoaded(rewardedAd: RewardedAd) { super.onAdLoaded(rewardedAd) // 加載成功 this@AdmobExampleActivity.rewardedAd = rewardedAd // 設(shè)置廣告事件回調(diào) this@AdmobExampleActivity.rewardedAd?.fullScreenContentCallback = rewardedVideoAdCallback // 展示廣告 this@AdmobExampleActivity.rewardedAd?.show(this@AdmobExampleActivity, rewardedVideoAdEarnedCallback) } override fun onAdFailedToLoad(loadAdError: LoadAdError) { super.onAdFailedToLoad(loadAdError) // 加載失敗 } } private val rewardedVideoAdCallback = object : FullScreenContentCallback() { override fun onAdImpression() { super.onAdImpression() // 被記錄為展示成功時(shí)調(diào)用 } override fun onAdShowedFullScreenContent() { super.onAdShowedFullScreenContent() // 顯示時(shí)調(diào)用 } override fun onAdClicked() { super.onAdClicked() // 被點(diǎn)擊時(shí)調(diào)用 } override fun onAdDismissedFullScreenContent() { super.onAdDismissedFullScreenContent() // 隱藏時(shí)調(diào)用,此時(shí)銷毀當(dāng)前的激勵(lì)視頻廣告對(duì)象,重新加載激勵(lì)視頻廣告 rewardedAd = null loadRewardedVideoAd() } override fun onAdFailedToShowFullScreenContent(adError: AdError) { super.onAdFailedToShowFullScreenContent(adError) // 展示失敗時(shí)調(diào)用,此時(shí)銷毀當(dāng)前的激勵(lì)視頻廣告對(duì)象,重新加載激勵(lì)視頻廣告 rewardedAd = null loadRewardedVideoAd() } } private val rewardedVideoAdEarnedCallback = OnUserEarnedRewardListener { // 用戶獲得獎(jiǎng)勵(lì)回調(diào) // 獎(jiǎng)勵(lì)的類型 val type = it.type // 獎(jiǎng)勵(lì)的金額 val amount = it.amount } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MobileAds.initialize(this, object : OnInitializationCompleteListener { override fun onInitializationComplete(initializationStatus: InitializationStatus) { ... loadRewardedVideoAd() } }) binding.btnShowInterstitialAd.setOnClickListener { showInterstitialAd() } } private fun loadRewardedVideoAd() { // adUnitId為Admob后臺(tái)創(chuàng)建的激勵(lì)視頻廣告的id RewardedAd.load(this, "adUnitId", AdRequest.Builder().build(), rewardedAdLoadCallback) } }
Banner廣告
Banner廣告的加載、展示等代碼如下:
class AdmobExampleActivity : AppCompatActivity() { private lateinit var binding: LayoutAdmobExampleActivityBinding private var bannerAdView: AdView? = null private val bannerListener = object : AdListener() { override fun onAdLoaded() { super.onAdLoaded() // 廣告加載成功 } override fun onAdFailedToLoad(loadAdError: LoadAdError) { super.onAdFailedToLoad(loadAdError) // 廣告加載失敗 } override fun onAdImpression() { super.onAdImpression() // 被記錄為展示成功時(shí)調(diào)用 } override fun onAdClicked() { super.onAdClicked() // 被點(diǎn)擊時(shí)調(diào)用 } override fun onAdOpened() { super.onAdOpened() // 廣告落地頁(yè)打開(kāi)時(shí)調(diào)用 } override fun onAdClosed() { super.onAdClosed() // 廣告落地頁(yè)關(guān)閉時(shí)調(diào)用 } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MobileAds.initialize(this, object : OnInitializationCompleteListener { override fun onInitializationComplete(initializationStatus: InitializationStatus) { createBannerAdView() } }) } private fun createBannerAdView() { // 獲取頁(yè)面的根布局 val rootView = findViewById<FrameLayout>(android.R.id.content) bannerAdView = AdView(this) bannerAdView?.run { // 設(shè)置Banner的尺寸 setAdSize(AdSize.BANNER) // adUnitId為Admob后臺(tái)創(chuàng)建的Banner廣告的id adUnitId = "adUnitId" // 設(shè)置廣告事件回調(diào) adListener = bannerListener val bannerViewLayoutParams = FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT) // 設(shè)置顯示在頁(yè)面的底部中間 bannerViewLayoutParams.gravity = Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL layoutParams = bannerViewLayoutParams alpha = 0f // 把 Banner Ad 添加到根布局 rootView.addView(this) //加載廣告 loadAd(AdRequest.Builder().build()) } } }
測(cè)試廣告
注意,Admob官方聲明了在開(kāi)發(fā)過(guò)程中啟用測(cè)試廣告非常重要,這樣您就可以在不向 Google 廣告客戶收費(fèi)的情況下點(diǎn)擊廣告。如果您在非測(cè)試模式下點(diǎn)擊過(guò)多廣告,可能會(huì)導(dǎo)致您的帳號(hào)因無(wú)效活動(dòng)而被舉報(bào)。
想要測(cè)試廣告的效果,可以通過(guò)兩種方式。
- 使用谷歌提供的測(cè)試id
谷歌提供了一整套測(cè)試id,使用這套id可以獲取Admob的測(cè)試廣告。
// 測(cè)試應(yīng)用id ApplicationId:"ca-app-pub-3940256099942544~3347511713" // 測(cè)試插屏廣告id InterstitialUnitId:"ca-app-pub-3940256099942544/1033173712" // 測(cè)試激勵(lì)視頻廣告id RewardedVideoUnitId:"ca-app-pub-3940256099942544/5224354917" // 測(cè)試Banner廣告id BannerUnitId:"ca-app-pub-3940256099942544/6300978111"
- 使用自己應(yīng)用的id,并注冊(cè)測(cè)試設(shè)備
如果想要使用自己應(yīng)用的id進(jìn)行測(cè)試,可以通過(guò)注冊(cè)測(cè)試設(shè)備來(lái)拉取測(cè)試廣告。
集成好SDK后,安裝App,查看tag為Ads的日志,可以看到測(cè)試設(shè)備id,如下:
獲取測(cè)試設(shè)備id后,通過(guò)代碼注冊(cè)測(cè)試設(shè)備,如下:
MobileAds.setRequestConfiguration(RequestConfiguration.Builder() .setTestDeviceIds(arrayListOf("deviceId")) .build())
注冊(cè)好測(cè)試設(shè)備后重新安裝App即可。
示例
整合之后,使用Admob提供的測(cè)試設(shè)備做了個(gè)示例demo。
效果如圖:
以上就是Android Admob接入原理及完整教程示例的詳細(xì)內(nèi)容,更多關(guān)于Android Admob接入的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android MVVM架構(gòu)實(shí)現(xiàn)RecyclerView列表詳解流程
MVVM是Model-View-ViewModel的簡(jiǎn)寫。它本質(zhì)上就是MVC 的改進(jìn)版。MVVM 就是將其中的View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務(wù)邏輯分開(kāi)2021-10-10Android開(kāi)源項(xiàng)目PullToRefresh下拉刷新功能詳解2
這篇文章主要為大家進(jìn)一步的介紹了Android開(kāi)源項(xiàng)目PullToRefresh下拉刷新功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Android?中TextureView和SurfaceView的屬性方法及示例說(shuō)明
這篇文章主要介紹了Android?中TextureView和SurfaceView的屬性方法及示例說(shuō)明,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06Android在kts中使用navigation及Args的方法
在Android項(xiàng)目中使用Kotlin腳本(kts)替代Groovy配置navigation和Args,需添加相關(guān)依賴,并在build.gradle中進(jìn)行配置,文章詳細(xì)介紹了如何在kts中使用navigation進(jìn)行頁(yè)面導(dǎo)航和參數(shù)傳遞,介紹了使用Bundle和Safe Args兩種方式安全傳遞參數(shù)2024-10-10Android使用surfaceView自定義抽獎(jiǎng)大轉(zhuǎn)盤
這篇文章主要為大家詳細(xì)介紹了Android使用surfaceView自定義抽獎(jiǎng)大轉(zhuǎn)盤,熟練掌握SurfaceVie實(shí)現(xiàn)抽獎(jiǎng)大轉(zhuǎn)盤,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android系統(tǒng)默認(rèn)對(duì)話框添加圖片功能
這篇文章主要介紹了Android系統(tǒng)默認(rèn)對(duì)話框添加圖片的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01Flutter以兩種方式實(shí)現(xiàn)App主題切換的代碼
這篇文章主要介紹了Flutter以兩種方式實(shí)現(xiàn)App主題切換的代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Kotlin中List的Lambda表達(dá)式應(yīng)用與解析實(shí)例詳解
相比于Java的Lambda表達(dá)式只是一種簡(jiǎn)化寫法,Kotlin中的Lambda功能極為強(qiáng)大,本文介紹Kotlin中List的Lambda表達(dá)式應(yīng)用與解析,感興趣的朋友一起看看吧2024-03-03Android面向單Activity開(kāi)發(fā)示例解析
這篇文章主要為大家介紹了Android面向單Activity開(kāi)發(fā)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02android實(shí)現(xiàn)視頻的加密和解密(使用AES)
本篇文章主要介紹了android實(shí)現(xiàn)視頻的加密和解密(使用AES),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05