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

Android Admob插屏广告仅在应用启动后展示一次问题咨询

问题原因

Admob插屏广告为一次性使用资源,你的现有代码中,广告首次展示后会在onAdShowedFullScreenContent回调里将mInterstitialAd置为null,但是没有触发新的广告加载逻辑,因此第二次点击按钮时没有可用的广告实例,无法弹出广告。

修复方案
  1. 将插屏广告的加载逻辑封装为独立公共方法,方便重复调用
  2. 在两个时机触发广告加载:
    • SDK初始化完成后,加载首次展示的广告
    • 广告被用户关闭、或者广告展示失败后,立刻预加载下一次要用的广告
完整修改代码

1. 封装广告加载方法

private void loadInterstitialAd() {
    AdRequest adRequest = new AdRequest.Builder().build();
    InterstitialAd.load(this,"ca-app-pub-3940256099942544/1033173712", adRequest, new InterstitialAdLoadCallback() {
        @Override
        public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
            mInterstitialAd = interstitialAd;
            mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback(){
                @Override
                public void onAdDismissedFullScreenContent() {
                    Toast.makeText(getApplicationContext(), "广告已关闭。\n",
                            Toast.LENGTH_LONG).show();
                    // 广告关闭后预加载下一次广告
                    loadInterstitialAd();
                }

                @Override
                public void onAdFailedToShowFullScreenContent(AdError adError) {
                    Log.d("TAG", "广告展示失败");
                    Toast.makeText(getApplicationContext(), "广告展示失败。\n",
                            Toast.LENGTH_LONG).show();
                    mInterstitialAd = null;
                    // 展示失败也重新加载新广告
                    loadInterstitialAd();
                }

                @Override
                public void onAdShowedFullScreenContent() {
                    mInterstitialAd = null;
                    Toast.makeText(getApplicationContext(), "广告已展示\n",
                            Toast.LENGTH_LONG).show();
                }
            });
        }

        @Override
        public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
            super.onAdFailedToLoad(loadAdError);
            Toast.makeText(getApplicationContext(),loadAdError +" 插屏广告未加载完成\n",
                    Toast.LENGTH_LONG).show();
            Log.i(TAG, loadAdError.getMessage());
            mInterstitialAd = null;
        }
    });
}

2. 调整SDK初始化逻辑

MobileAds.initialize(this, new OnInitializationCompleteListener() {
  @Override
  public void onInitializationComplete(InitializationStatus initializationStatus) {
      // 初始化完成后加载首次广告
      loadInterstitialAd();
  }
});

3. 按钮点击逻辑无需修改,保留原有逻辑即可

showAd = findViewById(R.id.showAd);
showAd.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        if (mInterstitialAd != null) {
            mInterstitialAd.show(MainActivity.this);
        } else {
            Toast.makeText(getApplicationContext(), "插屏广告还未准备就绪\n", Toast.LENGTH_LONG).show();
        }
    }
});
注意事项
  • 不要频繁触发广告加载请求,否则会被Admob限流,上述方案仅在广告用完后才触发下一次加载,符合官方规范
  • 测试阶段请使用官方提供的测试广告ID,不要用正式ID测试,避免账号被处罚
  • 如果在Fragment中使用该逻辑,注意上下文参数不要传错
  • 可以给广告展示按钮加点击防抖,避免用户快速重复点击时多次弹出未就绪提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:45:03