AdMob Error Code 1(广告已展示)错误触发原因及处理方法问询
对应返回错误:
{ "Code": 1, "Message": "The ad has already been shown.", "Domain": "com.google.android.gms.ads", "Cause": "null" }
错误触发原因
- 该错误属于AdMob全屏广告(插屏、激励视频、插屏激励等类型)的常见逻辑错误,核心触发逻辑是同一个广告实例被重复调用了
show()方法:AdMob的全屏广告实例都是一次性使用对象,仅支持一次展示,只要已经调用过show(),无论展示是否成功,后续再调用同一个实例的show()就会触发该回调。 - 「广告正常展示但仍触发该回调」的场景基本都是代码逻辑存在重复触发
show()的执行路径:比如触发广告展示的点击事件没有添加防抖,短时间内多次执行show(),第一次调用成功展示了广告,第二次调用就触发了该错误回调;也有可能是页面生命周期回调(如onResume、onWindowFocusChanged)中错误写入了广告展示逻辑,广告弹出后生命周期回调再次执行,触发了二次show()调用。 - 少数场景下部分机型的系统输入事件会存在重复上报的问题,也可能导致单次用户操作触发多次
show()执行。
修复方案
- 展示前先校验广告状态:每次调用
show()前,必须调用对应广告实例的isLoaded()方法确认广告处于可展示状态,仅当返回true时执行后续展示逻辑。 - 增加全局展示锁:定义一个布尔类型的标记位
isAdShowing,执行show()前判断该标记位,若为true直接拦截展示请求;调用show()时将标记位置为true,在广告的onAdDismissedFullScreenContent、onAdFailedToShowFullScreenContent回调中再将标记位重置为false。 - 禁止复用已使用过的广告实例:只要广告实例触发过展示相关回调(无论成功或失败),直接调用
destroy()销毁该实例,重新走广告加载流程获取新的广告实例供下次展示使用。 - 给广告展示的触发入口添加防抖逻辑,拦截1s内的重复触发请求,避免用户快速点击导致的重复调用。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

