如何在Libgdx游戏中添加插屏广告?含AdMob Android端集成疑问
在LibGDX Android游戏中集成AdMob插屏广告的完整指南
我最近刚搞定了LibGDX Android游戏的AdMob插屏广告集成,发现很多教程只覆盖横幅广告,所以整理了一套亲测可行的完整步骤。核心思路是利用LibGDX的跨平台接口机制,把Android端的广告逻辑封装起来,让核心游戏代码能无缝调用:
1. 配置AdMob依赖与Manifest
首先在Android模块的build.gradle(Module: android)中添加AdMob依赖:
dependencies { // 保留你原有的其他依赖 implementation 'com.google.android.gms:play-services-ads:22.6.0' }
接着修改AndroidManifest.xml,添加必要权限和AdMob应用ID:
<!-- 广告联网所需权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application ...> <!-- 替换成你自己的AdMob应用ID --> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/> </application>
2. 创建跨平台广告接口
在LibGDX核心模块(core)中定义一个接口,让核心代码无需关心Android端的具体实现:
public interface InterstitialAdHandler { // 加载插屏广告 void loadInterstitialAd(); // 显示已加载的插屏广告 void showInterstitialAd(); // 广告状态回调接口,用于通知核心代码广告状态 interface AdCallback { void onAdLoaded(); void onAdFailedToLoad(String errorMsg); void onAdClosed(); } void setAdCallback(AdCallback callback); }
3. 在Android端实现广告接口
在Android模块中编写接口的具体实现,处理AdMob插屏广告的加载、显示和回调:
import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdError; import com.google.android.gms.ads.InterstitialAd; import com.google.android.gms.ads.LoadAdError; import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback; import com.google.android.gms.ads.FullScreenContentCallback; import com.badlogic.gdx.backends.android.AndroidApplication; public class AndroidInterstitialAdHandler implements InterstitialAdHandler { private AndroidApplication appContext; private InterstitialAd interstitialAd; private AdCallback adCallback; public AndroidInterstitialAdHandler(AndroidApplication app) { this.appContext = app; } @Override public void loadInterstitialAd() { // 开发阶段用AdMob测试ID,正式环境替换为你的插屏广告ID String adUnitId = "ca-app-pub-3940256099942544/1033173712"; InterstitialAd.load( appContext, adUnitId, new AdRequest.Builder().build(), new InterstitialAdLoadCallback() { @Override public void onAdLoaded(InterstitialAd ad) { interstitialAd = ad; if (adCallback != null) { appContext.runOnUiThread(() -> adCallback.onAdLoaded()); } // 设置广告关闭回调 ad.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { interstitialAd = null; if (adCallback != null) { appContext.runOnUiThread(() -> adCallback.onAdClosed()); } } @Override public void onAdFailedToShowFullScreenContent(AdError adError) { interstitialAd = null; if (adCallback != null) { appContext.runOnUiThread(() -> adCallback.onAdFailedToLoad(adError.getMessage())); } } }); } @Override public void onAdFailedToLoad(LoadAdError loadAdError) { interstitialAd = null; if (adCallback != null) { appContext.runOnUiThread(() -> adCallback.onAdFailedToLoad(loadAdError.getMessage())); } } } ); } @Override public void showInterstitialAd() { if (interstitialAd != null) { appContext.runOnUiThread(() -> interstitialAd.show(appContext)); } else { if (adCallback != null) { adCallback.onAdFailedToLoad("广告尚未加载完成"); } } } @Override public void setAdCallback(AdCallback callback) { this.adCallback = callback; } }
4. 在核心模块中调用广告功能
先在AndroidLauncher中把广告处理器传递给核心游戏类:
public class AndroidLauncher extends AndroidApplication { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); // 创建广告处理器实例 InterstitialAdHandler adHandler = new AndroidInterstitialAdHandler(this); // 传递给核心游戏类 initialize(new MyGdxGame(adHandler), config); } }
然后在核心模块的游戏类(或屏幕类)中使用广告处理器:
import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; public class MyGdxGame extends Game { private InterstitialAdHandler adHandler; public MyGdxGame(InterstitialAdHandler adHandler) { this.adHandler = adHandler; // 设置广告状态回调 adHandler.setAdCallback(new InterstitialAdHandler.AdCallback() { @Override public void onAdLoaded() { Gdx.app.log("AdStatus", "插屏广告加载完成"); } @Override public void onAdFailedToLoad(String errorMsg) { Gdx.app.log("AdError", errorMsg); // 可选:加载失败后重试 // adHandler.loadInterstitialAd(); } @Override public void onAdClosed() { Gdx.app.log("AdStatus", "广告已关闭"); // 广告关闭后重新加载,为下一次显示做准备 adHandler.loadInterstitialAd(); // 这里可以添加广告关闭后的游戏逻辑,比如回到关卡选择 } }); // 初始化时加载第一个广告 adHandler.loadInterstitialAd(); } @Override public void create() { // 你的游戏初始化逻辑... // 示例:在关卡结束时调用显示广告 // whenLevelCompleted() { // adHandler.showInterstitialAd(); // } } }
关键注意事项
- 测试广告ID:开发阶段必须使用AdMob提供的测试ID,避免触发广告政策违规,测试ID可在AdMob官方文档中找到。
- 线程安全:所有AdMob操作必须在Android主线程执行,所以代码中用
appContext.runOnUiThread()确保这一点。 - 广告生命周期:广告关闭后记得重新加载,保证下次需要显示时有可用广告;在Activity销毁时(如
AndroidLauncher的onDestroy),要清理未销毁的广告实例避免内存泄漏。 - 显示时机:避免在游戏关键操作中突然弹出广告,建议选择关卡结束、游戏暂停、玩家主动触发等合理时机。
内容的提问来源于stack exchange,提问作者Kevin Bryan
相关产品推荐
相关产品推荐

