如何在LibGDX游戏中集成AdMob插屏广告及适配对应Activity
插屏广告实现方案(适配新版AdMob+LibGDX)
你的代码存在两个核心问题:空指针风险(回调设置时机错误)和加载逻辑缺失,同时对show()方法的Activity参数存在误解,以下是完整修复方案:
核心修复点
1. 调整回调绑定时机
不能在广告加载前直接给mInterstitialAd设置回调,此时mInterstitialAd还是null,必然触发空指针。必须在onAdLoaded回调中(广告成功加载后)再绑定全屏内容回调。
2. 正确传递Activity参数
AndroidLauncher继承自AndroidApplication,而AndroidApplication本身就是Activity子类,直接传递AndroidLauncher.this即可满足show()方法的参数要求。
3. 完善广告加载逻辑
loadInterstitialAd()方法需要实现完整的广告加载流程,同时在广告关闭/展示失败后自动加载下一个广告,保证后续有广告可用。
修改后的完整代码
public class AndroidLauncher extends AndroidApplication implements AdsController { InterstitialAd mInterstitialAd; private static final String TAG = "AndroidLauncher"; // 测试用插屏广告ID,正式环境替换为你的自有ID private static final String INTERSTITIAL_AD_ID = "ca-app-pub-3940256099942544/1033173712"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 保留原有Banner广告的布局与游戏视图初始化逻辑 RelativeLayout layout = new RelativeLayout(this); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); View gameView = initializeForView(new mygame(this), config); layout.addView(gameView); // 初始化AdMob SDK MobileAds.initialize(this, initializationStatus -> {}); // 首次加载插屏广告 loadInterstitialAd(); setContentView(layout); } @Override public void loadInterstitialAd() { AdRequest adRequest = new AdRequest.Builder().build(); InterstitialAd.load(this, INTERSTITIAL_AD_ID, adRequest, new InterstitialAdLoadCallback() { @Override public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { mInterstitialAd = interstitialAd; Log.i(TAG, "插屏广告加载完成"); // 加载成功后绑定全屏回调 mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { Log.d(TAG, "插屏广告已关闭"); mInterstitialAd = null; // 自动加载下一个广告 loadInterstitialAd(); } @Override public void onAdFailedToShowFullScreenContent(AdError adError) { Log.e(TAG, "插屏广告展示失败: " + adError.getMessage()); mInterstitialAd = null; loadInterstitialAd(); } @Override public void onAdShowedFullScreenContent() { Log.d(TAG, "插屏广告正在展示"); } }); } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { Log.e(TAG, "插屏广告加载失败: " + loadAdError.getMessage()); mInterstitialAd = null; } }); } @Override public void showInterstitialAd() { runOnUiThread(() -> { if (mInterstitialAd != null) { // 传递当前Activity实例 mInterstitialAd.show(AndroidLauncher.this); } else { Log.w(TAG, "无可用插屏广告,尝试重新加载"); loadInterstitialAd(); } }); } }
额外注意事项
- 确保
build.gradle中引入最新版AdMob依赖,例如com.google.android.gms:play-services-ads:22.6.0或更高版本 - 测试阶段必须使用Google提供的测试广告ID,避免触发AdMob风控限制
- 游戏逻辑中调用
showInterstitialAd()时,选择合理的触发时机(如关卡结束、游戏重启等)
内容的提问来源于stack exchange,提问作者tall tower
相关产品推荐
相关产品推荐

