AdMob插页广告无法启动,提示未就绪问题求助
问题分析与修复方案
你的代码存在几个核心问题,直接导致插屏广告无法加载并触发The interstitial ad wasn't ready yet.日志:
- 初始判断逻辑完全颠倒:
mInterstitialAd初始值为null,所以if (mInterstitialAd != null)分支根本不会执行,直接进入else输出广告未就绪的日志。 - 异步加载后立即调用show:插屏广告加载是异步操作,
InterstitialAd.load()调用后不会立刻完成加载,你在调用load后马上执行show(),此时广告还未加载完成,自然无法展示。 - FullScreenContentCallback设置时机错误:应该在广告加载完成(
onAdLoaded回调)后再设置回调,而不是在加载前。
修正后的代码
class MainActivity : AppCompatActivity() { private var mInterstitialAd: InterstitialAd? = null private val TAG = "MainActivity" // 替换成你的插屏广告单元ID,测试阶段可使用AdMob官方测试ID private val AD_UNIT_ID = "ca-app-pub-3940256099942544/1033173712" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) MobileAds.initialize(this) {} val adRequest = AdRequest.Builder().build() adView?.loadAd(adRequest) // 直接触发插屏广告加载 loadInterstitialAd(adRequest) } // 封装插屏广告加载方法 private fun loadInterstitialAd(adRequest: AdRequest) { InterstitialAd.load(this, AD_UNIT_ID, adRequest, object : InterstitialAdLoadCallback() { override fun onAdFailedToLoad(adError: LoadAdError) { Log.d(TAG, "广告加载失败: ${adError.toString()}") mInterstitialAd = null // 可在此处添加重试逻辑 } override fun onAdLoaded(interstitialAd: InterstitialAd) { Log.d(TAG, "广告加载完成") mInterstitialAd = interstitialAd // 加载完成后设置回调 setAdCallback() // 建议绑定用户主动操作展示广告,而非自动展示(避免违规) // mInterstitialAd?.show(this@MainActivity) } }) } private fun setAdCallback() { mInterstitialAd?.fullScreenContentCallback = object : FullScreenContentCallback() { override fun onAdClicked() { Log.d(TAG, "广告被点击") } override fun onAdDismissedFullScreenContent() { Log.d(TAG, "插屏广告被关闭") mInterstitialAd = null // 广告关闭后加载下一个广告 val adRequest = AdRequest.Builder().build() loadInterstitialAd(adRequest) } override fun onAdFailedToShowFullScreenContent(adError: AdError) { Log.e(TAG, "广告展示失败: ${adError.toString()}") mInterstitialAd = null } override fun onAdImpression() { Log.d(TAG, "广告曝光记录") } override fun onAdShowedFullScreenContent() { Log.d(TAG, "插屏广告展示") mInterstitialAd = null // 展示后清空,避免重复展示 } } } // 示例:绑定按钮点击事件展示广告 fun showAdOnButtonClick(view: View) { mInterstitialAd?.let { ad -> ad.show(this) } ?: run { Log.d(TAG, "广告未就绪,开始加载") val adRequest = AdRequest.Builder().build() loadInterstitialAd(adRequest) } } }
关键修复说明
- 调整加载逻辑:移除错误的非空判断,直接触发广告加载,确保广告初始化流程正常启动。
- 异步回调后操作:仅在
onAdLoaded回调触发后,才设置回调并执行展示操作,保证广告已完全就绪。 - 优化展示时机:建议将广告展示绑定到用户主动操作(如按钮点击),避免在页面启动时自动展示,降低违规风险。
- 封装方法解耦:拆分加载与回调设置逻辑,代码更易维护,同时支持广告关闭后自动加载下一个广告。
补充提示:Banner广告正常说明你的AdMob初始化和依赖配置无问题,只需聚焦插屏广告的逻辑修正;测试阶段推荐使用AdMob官方测试ID,避免触发真实广告的展示限制。
内容的提问来源于stack exchange,提问作者Emi
相关产品推荐
相关产品推荐

