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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:12:54