Android Admob插屏广告仅在应用启动后展示一次问题咨询
问题原因
Admob插屏广告为一次性使用资源,你的现有代码中,广告首次展示后会在onAdShowedFullScreenContent回调里将mInterstitialAd置为null,但是没有触发新的广告加载逻辑,因此第二次点击按钮时没有可用的广告实例,无法弹出广告。
修复方案
- 将插屏广告的加载逻辑封装为独立公共方法,方便重复调用
- 在两个时机触发广告加载:
- 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
相关产品推荐
相关产品推荐

