news 2026/9/13 20:53:16

Google Mobile Ads Next-Gen 安卓横幅广告集成指南(Android Banner Ads)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Google Mobile Ads Next-Gen 安卓横幅广告集成指南(Android Banner Ads)

Google Mobile Ads Next-Gen 安卓横幅广告集成指南(Android Banner Ads)

【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills

导读

本文基于skills/ads/google-mobile-ads-banner技能集中的 Android 平台参考文档,系统讲解如何在 Android 应用中通过 GMA Next-Gen SDK(com.google.android.libraries.ads.mobile.sdk)实现 Banner(横幅)广告的完整流程:从定义AdView、选择自适应广告尺寸、注册加载回调到调用loadAd()加载广告,并覆盖构建验证与测试广告单元替换等上线前关键步骤。阅读完本文后,你将能独立为 Android 应用接入大型锚定自适应横幅、内联自适应横幅等主流 Banner 广告位,并规避 GMA Next-Gen SDK 中最容易导致崩溃的 UI 线程回调陷阱。

Banner 广告类型速览

在动手编码前,先明确 Banner 广告的类型。根据 SKILL.md 中的定义,Android 平台常用的 Banner 广告分为三类:

Banner 类型说明
Large Anchored Adaptive(大型锚定自适应)默认推荐类型,可锚定在屏幕顶部或底部,宽度可自适应。
Anchored Adaptive(锚定自适应)同样可锚定在屏幕顶部或底部,但高度更矮。
Inline Adaptive(内联自适应)仅 Android 与 iOS 可用,嵌入在内容流中随内容滚动。

默认策略是:用户只说 "banner" 而未指定类型时,优先使用Large Anchored Adaptive;若用户反馈大型锚定横幅过高,则回退到高度更矮的锚定自适应类型。

前置条件:GMA Next-Gen SDK 集成

Banner 广告代码依赖 GMA Next-Gen SDK。按照 android-get-started.md 的指引,集成前需完成:

  • 添加 SDK 依赖:在 app 级构建文件中引入最新稳定版com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk;若无法直接访问 Maven,可执行以下命令查询最新版本号(latest标签即最新版):
    curl -sS https://dl.google.com/dl/android/maven2/com/google/android/libraries/ads/mobile/sdk/ads-mobile-sdk/maven-metadata.xml | sed -n 's/.*<latest>\(.*\)<\/latest>.*/\1/p'
  • 配置 SDK 版本minSdk需为 24+,compileSdk需为 34+。
  • 排除旧版广告依赖:在全局依赖中排除play-services-adsplay-services-ads-lite,避免重复符号错误。
  • 初始化 SDK:使用MobileAds.initialize()在后台线程完成初始化,InitializationConfig.Builder中传入 AdMob App ID(测试用ca-app-pub-3940256099942544~3347511713,发布前必须替换为真实 App ID)。

Required Imports:横幅广告所需导入

根据 android-banner.md 的要求,实现横幅广告需要以下导入语句:

import com.google.android.libraries.ads.mobile.sdk.banner.AdSize import com.google.android.libraries.ads.mobile.sdk.banner.AdView import com.google.android.libraries.ads.mobile.sdk.banner.BannerAd import com.google.android.libraries.ads.mobile.sdk.banner.BannerAdRequest import com.google.android.libraries.ads.mobile.sdk.common.AdLoadCallback import com.google.android.libraries.ads.mobile.sdk.common.LoadAdError

关键类型职责如下:

  • AdView:用于定义横幅广告的视图容器,是 Next-Gen SDK 中定义横幅的唯一入口(旧版BannerAd已废弃)。
  • BannerAdRequest:广告请求对象,承载广告单元 ID(ad unit ID)与AdSize
  • BannerAd:加载成功后的横幅广告对象。
  • AdLoadCallback<T>:广告加载回调接口。
  • LoadAdError:广告加载失败时携带的错误信息对象。

核心方法签名

1. 构建广告请求

BannerAdRequest通过Builder接收广告单元 ID 与AdSize

BannerAdRequest.Builder(adUnitId: String, adSize: AdSize).build()

注意AdSize与广告单元 ID 应通过BannerAdRequest.Builder传入,而不是直接设置在AdView上。

2. 加载横幅广告

AdView加载横幅广告的方法签名:

fun loadAd( adRequest: BannerAdRequest, adLoadCallback: AdLoadCallback<BannerAd> ): Unit

AdLoadCallback同样是通过loadAd()方法传入,而非直接设置在AdView上。

3. 广告加载回调接口

interface AdLoadCallback<T> { fun onAdLoaded(ad: T): Unit fun onAdFailedToLoad(adError: LoadAdError): Unit }
  • onAdLoaded(ad):广告加载成功后回调,adBannerAd实例。
  • onAdFailedToLoad(adError):广告加载失败时回调,adErrorLoadAdError,可用于排查失败原因。

关键陷阱:UI 线程强制约束

这是 GMA Next-Gen SDK 与旧版 SDK 最大的行为差异,也是 android-banner.md 中特别标注为MANDATORY的注意事项:

GMA Next-Gen SDK 的AdLoadCallback回调运行在后台线程。所有 UI 相关操作(如 Toast 提示、View 更新、Fragment 事务)必须runOnUiThread {}Dispatchers.Main.launch {}中执行。跳过此步骤将导致应用崩溃。

正确写法示例:

adView.loadAd(adRequest, object : AdLoadCallback<BannerAd> { override fun onAdLoaded(ad: BannerAd) { runOnUiThread { // 在此更新 UI,如显示 BannerAdView binding.bannerContainer.addView(ad.adView) } } override fun onAdFailedToLoad(adError: LoadAdError) { runOnUiThread { Toast.makeText(context, "广告加载失败: ${adError.message}", Toast.LENGTH_SHORT).show() } } })

这一约束在 Unity 平台同样存在:Unity 参考文档 unity-banner.md 明确要求所有涉及UnityEngine对象的回调必须通过MobileAdsEventExecutor.ExecuteInUpdate()调度到主线程,因为 Unity API 非线程安全。

Banner 广告五步工作流

以下是 android-banner.md 给出的完整实施流程。

第 1 步:定义广告视图

使用AdView定义 GMA Next-Gen SDK 横幅广告,不要使用已废弃的BannerAd来定义视图。

val adView = AdView(context)

第 2 步:设置广告尺寸

  • 测试宽度建议:为测试目的将AdSize使用的width设为360(也可以使用设备实际宽度,这也是常见做法)。
  • 按广告类型选择对应方法,同时使用对应的测试广告单元 IDca-app-pub-3940256099942544/9214589741
广告类型尺寸方法
大型锚定自适应横幅(默认)AdSize.getLargeAnchoredAdaptiveBannerAdSize(context, width)
锚定自适应横幅(当大型锚定过高时使用)AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(context, width)
内联自适应横幅AdSize.getCurrentOrientationInlineAdaptiveBannerAdSize(context, width)
  • AdSize与广告单元 ID 传入BannerAdRequest.Builder,而不是直接设置在AdView上。
val width = 360 val adSize = AdSize.getLargeAnchoredAdaptiveBannerAdSize(context, width) val adRequest = BannerAdRequest.Builder( adUnitId = "ca-app-pub-3940256099942544/9214589741", adSize = adSize ).build()

第 3 步:注册广告加载事件

loadAd()方法中传入AdLoadCallback实现,而不是直接设置在AdView上(见上文回调接口定义)。

第 4 步:加载横幅广告

adView.loadAd(adRequest, object : AdLoadCallback<BannerAd> { override fun onAdLoaded(ad: BannerAd) { /* runOnUiThread 中更新 UI */ } override fun onAdFailedToLoad(adError: LoadAdError) { /* runOnUiThread 中处理失败 */ } })

第 5 步:验证实现

执行gradle build -x test确认构建成功,并解决所有与 GMA SDK 相关的编译错误:

gradle build -x test

发布前必做:替换测试广告单元

Banner 广告工作流完成后,SKILL.md 要求提醒用户将测试广告单元 ID 替换为自有 ID。这对应google-mobile-ads-validate技能的校验规则:

  • 测试广告单元判定:任何以ca-app-pub-3940256099942544/开头的 AdMob 广告单元 ID 均为测试 ID(ad-units.md)。
  • 合法格式校验:AdMob 广告单元 ID 必须匹配正则^(ca-app-pub-[a-zA-Z0-9\-]+)/([a-zA-Z0-9_\-]+)(/.*)?$,格式错误即判为Fail;源码中出现测试 ID(即使被DEBUG开关保护)也会给出Warning
  • App ID 校验:AdMob App ID 必须匹配^(ca-app-pub-[a-zA-Z0-9\-]+)~(.*)$,官方测试 App ID 为ca-app-pub-3940256099942544~1458002511,发布前需替换(application-id.md)。

因此生产环境的广告单元 ID 应形如ca-app-pub-你的发布者ID/你的广告位ID,App ID 形如ca-app-pub-你的发布者ID~你的应用ID

与 iOS / Unity 平台的对应关系

同为 Banner 广告集成,不同平台的 API 形态略有差异,便于多端维护时对照参考:

步骤Android(本文)iOS(ios-banner.md)Unity(unity-banner.md)
广告视图AdViewBannerViewrootViewController可选,可传nilBannerViewGoogleMobileAds.Api
测试广告单元 IDca-app-pub-3940256099942544/9214589741ca-app-pub-3940256099942544/2435281174按平台分别使用上述两个 ID
测试宽度360375MobileAds.Utils.GetDeviceSafeWidth()
大型锚定自适应尺寸getLargeAnchoredAdaptiveBannerAdSizelargeAnchoredAdaptiveBanner(width:)GetCurrentOrientationLargeAnchoredAdaptiveBannerAdSizeWithWidth(width)
加载事件loadAd()传入AdLoadCallback设置delegate订阅OnBannerAdLoaded等事件(可选)
加载广告loadAd(adRequest, callback)调用加载方法bannerView.LoadAd(new AdRequest())
构建验证gradle build -x testxcodebuild(不可用时在 Xcode 中手动验证)dotnet build(编译 csproj)

其中 iOS 的尺寸全局函数还包括与 Android 对应的currentOrientationAnchoredAdaptiveBanner(width:)(大型锚定过高时使用)与currentOrientationInlineAdaptiveBanner(width:)(内联自适应);Unity 的事件订阅还涵盖OnAdPaid(记录预估广告收入)、OnAdImpressionRecorded(统计展示)与OnAdFullScreenContentOpened/Closed(暂停/恢复游戏逻辑)等,可作为跨端实现时的参考清单。

小结

Android 平台集成 GMA Next-Gen SDK 横幅广告的要点可概括为:使用AdView定义视图、通过BannerAdRequest.Builder(adUnitId, adSize)组装请求、按广告类型选择自适应尺寸方法、在loadAd()中传入AdLoadCallback,并始终在回调内用runOnUiThread包裹 UI 操作。最后以gradle build -x test验证构建,并在发布前将测试广告单元 ID 与测试 App ID 替换为自有值。掌握这套流程后,即可为应用稳定接入自适应横幅广告位。

【免费下载链接】skillsAgent Skills for Google products and technologies项目地址: https://gitcode.com/GitHub_Trending/skills29/skills

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 20:52:51

条件技术支持的价格逻辑重构与代码适配实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 20:52:33

lo 迭代器 TakeWhile 使用指南:从序列头部按条件取元素

lo 迭代器 TakeWhile 使用指南&#xff1a;从序列头部按条件取元素 【免费下载链接】lo &#x1f4a5; A Lodash-style Go library based on Go 1.18 Generics (map, filter, contains, find...) 项目地址: https://gitcode.com/GitHub_Trending/lo/lo 从序列开头连续取…

作者头像 李华
网站建设 2026/9/13 20:51:28

Linux WiFi驱动开发实战:从架构选型到设备树调优

最近帮一个客户调SDIO接口的WiFi模组&#xff0c;平台是ARM64&#xff0c;内核5.15。按理说这种模组的驱动已经非常成熟&#xff0c;芯片厂商的SDK一拉、编译、加载就应该能跑起来&#xff0c;但实际折腾了整整三天&#xff0c;最后发现大部分时间不是花在驱动代码上&#xff0…

作者头像 李华
网站建设 2026/9/13 20:49:37

AI大模型时代职业转型指南与新兴机遇

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华