You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
        }
    }
}

关键修复说明

  1. 调整加载逻辑:移除错误的非空判断,直接触发广告加载,确保广告初始化流程正常启动。
  2. 异步回调后操作:仅在onAdLoaded回调触发后,才设置回调并执行展示操作,保证广告已完全就绪。
  3. 优化展示时机:建议将广告展示绑定到用户主动操作(如按钮点击),避免在页面启动时自动展示,降低违规风险。
  4. 封装方法解耦:拆分加载与回调设置逻辑,代码更易维护,同时支持广告关闭后自动加载下一个广告。

补充提示:Banner广告正常说明你的AdMob初始化和依赖配置无问题,只需聚焦插屏广告的逻辑修正;测试阶段推荐使用AdMob官方测试ID,避免触发真实广告的展示限制。

内容的提问来源于stack exchange,提问作者Emi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:46:02