2018年如何在LibGdx项目中接入AdMob?解决Google Play Services异常
嘿,我当年在2018年做LibGdx项目接入AdMob的时候也踩过Google Play Services配置的坑,各种依赖冲突、运行崩溃的问题都遇到过,给你一步步梳理怎么无异常添加服务,再顺利接入AdMob:
第一步:正确配置Google Play Services(避免异常)
LibGdx是跨平台框架,所有和Android相关的配置都在android模块里操作,核心要注意依赖版本匹配和必要配置:
- 先准备好SDK依赖:打开Android SDK Manager,确保已经下载了
Google Play Services和Google Repository(2018年的版本不用太新,和你的gradle插件版本匹配就行,比如gradle插件3.0.1对应play services 15.x系列) - 配置Android模块的build.gradle:
- 在根目录build.gradle的
dependencies里,确保gradle插件版本是2018年稳定版:dependencies { classpath 'com.android.tools.build:gradle:3.0.1' // 其他依赖... } - 在android模块的build.gradle的
dependencies里添加AdMob的Play Services依赖,推荐用2018年最稳定的15.0.1版本:dependencies { implementation 'com.google.android.gms:play-services-ads:15.0.1' // 如果方法数超过65k,还要加multidex依赖: implementation 'com.android.support:multidex:1.0.3' // 其他LibGdx依赖... } - 如果开启multidex,在android模块build.gradle的
defaultConfig里添加:defaultConfig { multiDexEnabled true // 其他配置... }
- 在根目录build.gradle的
- 配置AndroidManifest.xml:
- 在
<manifest>标签下添加权限:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 在
<application>标签下添加Play Services版本元数据:<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
- 在
常见异常解决
- 如果遇到
Failed to resolve: com.google.android.gms:play-services-ads:x.x.x:检查是否下载了Google Repository,或者依赖版本和gradle插件不兼容,换成15.0.1试试 - 如果运行时出现
ClassNotFoundException或方法数溢出:开启multidex并添加对应依赖,同步gradle后清理项目重新构建 - 如果出现Google Play Services版本不兼容:确保设备上的Google Play Services版本和你依赖的版本差距不大,或者用Google官方的AVD模拟器测试
第二步:LibGdx中接入AdMob(2018年实现方式)
LibGdx的core模块不能直接调用Android API,所以用接口+平台实现的方式隔离平台代码:
- Core模块定义广告接口:创建
AdMobController.java
public interface AdMobController { void showBannerAd(); void hideBannerAd(); void showInterstitialAd(); }
- Android模块实现接口:创建
AndroidAdMobController.java
import com.badlogic.gdx.backends.android.AndroidApplication; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdSize; import com.google.android.gms.ads.AdView; import com.google.android.gms.ads.InterstitialAd; public class AndroidAdMobController implements AdMobController { private AndroidApplication app; private AdView bannerAd; private InterstitialAd interstitialAd; // 2018年AdMob测试ID,正式环境换成你的ID private final String BANNER_TEST_ID = "ca-app-pub-3940256099942544/6300978111"; private final String INTERSTITIAL_TEST_ID = "ca-app-pub-3940256099942544/1033173712"; public AndroidAdMobController(AndroidApplication app) { this.app = app; initBanner(); initInterstitial(); } private void initBanner() { bannerAd = new AdView(app); bannerAd.setAdSize(AdSize.SMART_BANNER); bannerAd.setAdUnitId(BANNER_TEST_ID); // 将Banner添加到Android布局 app.getView().addView(bannerAd); // 请求广告 AdRequest adRequest = new AdRequest.Builder().build(); bannerAd.loadAd(adRequest); } private void initInterstitial() { interstitialAd = new InterstitialAd(app); interstitialAd.setAdUnitId(INTERSTITIAL_TEST_ID); AdRequest adRequest = new AdRequest.Builder().build(); interstitialAd.loadAd(adRequest); } @Override public void showBannerAd() { // 必须在UI线程操作Android控件 app.runOnUiThread(() -> bannerAd.setVisibility(AdView.VISIBLE)); } @Override public void hideBannerAd() { app.runOnUiThread(() -> bannerAd.setVisibility(AdView.GONE)); } @Override public void showInterstitialAd() { app.runOnUiThread(() -> { if (interstitialAd.isLoaded()) { interstitialAd.show(); // 展示后重新加载下一个插屏 interstitialAd.loadAd(new AdRequest.Builder().build()); } }); } }
- 在AndroidLauncher中传入控制器
public class AndroidLauncher extends AndroidApplication { @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); AdMobController adMobController = new AndroidAdMobController(this); // 把控制器传给你的Game类,需要Game类有对应的构造方法 initialize(new MyGame(adMobController), config); } }
- Core模块调用广告方法
public class MyGame extends Game { private AdMobController adMobController; public MyGame(AdMobController adMobController) { this.adMobController = adMobController; } @Override public void create() { // 游戏启动时展示Banner adMobController.showBannerAd(); // 比如关卡结束时展示插屏 // adMobController.showInterstitialAd(); } }
额外注意事项
- 测试阶段一定要用AdMob提供的测试ID,用正式ID测试会被AdMob限流甚至封号
- 确保测试设备/模拟器安装了Google Play Services,2018年部分国产设备没有预装,需要手动安装
- 如果广告加载失败,查看Logcat的错误信息,常见原因是网络问题、ID错误、Play Services版本不匹配
内容的提问来源于stack exchange,提问作者Readyska 322
相关产品推荐
相关产品推荐

