使用AdMob示例ID无法加载插屏广告的技术求助
排查AdMob插屏广告加载失败(ErrorCode:0)的解决方案
我之前也碰到过一模一样的情况——用AdMob官方测试ID在Android 9模拟器上加载插屏广告,返回ErrorCode:0,日志显示请求响应异常。结合你的代码和测试环境,咱们一步步来排查解决:
1. 修复InterstitialAd的生命周期问题
你代码里的InterstitialAd是onCreate方法里的局部变量,当onCreate执行完成后,这个对象很可能被GC(垃圾回收)清理掉,导致广告加载完成后的onAdLoaded回调无法正常触发,甚至直接引发加载失败。
修改方案:把InterstitialAd改成Activity的成员变量,同时调整监听器和加载广告的顺序,再加个安全判断避免崩溃:
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import com.google.android.gms.ads.AdListener; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.InterstitialAd; import com.google.android.gms.ads.MobileAds; public class MainActivity extends AppCompatActivity { // 改为Activity成员变量,避免被GC回收 private InterstitialAd mInterstitialAd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713"); mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712"); // 先设置监听器,再执行加载广告操作 mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdLoaded() { // 确保Activity未销毁时再显示广告,避免崩溃 if (!isFinishing()) { mInterstitialAd.show(); } } // 重写失败回调,打印详细错误信息,方便排查 @Override public void onAdFailedToLoad(int errorCode) { String errorDesc = ""; switch (errorCode) { case AdRequest.ERROR_CODE_INTERNAL_ERROR: errorDesc = "内部服务错误"; break; case AdRequest.ERROR_CODE_INVALID_REQUEST: errorDesc = "请求参数无效"; break; case AdRequest.ERROR_CODE_NETWORK_ERROR: errorDesc = "网络连接异常"; break; case AdRequest.ERROR_CODE_NO_FILL: errorDesc = "暂无广告填充"; break; } Log.d("AdMobDebug", "广告加载失败:" + errorDesc + ",错误码:" + errorCode); } }); mInterstitialAd.loadAd(new AdRequest.Builder().build()); } }
2. 解决Android 9(API28)的明文网络限制
API28及以上的系统默认禁止明文HTTP请求,而你使用的play-services-ads:17.1.3是较旧版本,可能依赖部分明文请求,导致广告请求被系统拦截。
解决步骤:
- 在
res/xml目录下创建network_security_config.xml文件(如果没有xml目录就新建一个),内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config>
- 在
AndroidManifest.xml的application标签中添加该配置:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
3. 更新Google Play服务广告库版本
你当前使用的play-services-ads:17.1.3是多年前的旧版本,存在不少已知的兼容性问题,建议更新到适配API28的稳定版本(比如20.6.0,注意和你的compileSdkVersion匹配)。
修改build.gradle中的依赖:
// 替换旧版本为新的稳定版 implementation 'com.google.android.gms:play-services-ads:20.6.0'
如果选择这个版本,建议把compileSdkVersion升级到30,避免版本兼容问题。
4. 模拟器环境的额外检查
- 更新Google Play服务:打开模拟器里的Google Play应用,检查并更新到最新版本,即使系统显示版本正常,也手动检查下更新。
- 关闭代理:如果你的电脑开启了代理,模拟器会继承这个设置,导致广告请求无法正常到达AdMob服务器,建议关闭代理后再测试。
- 登录Google账号:部分模拟器需要登录Google账号才能正常加载测试广告,尝试在模拟器里登录你的Google账号后再运行测试。
按照以上步骤调整后,应该能解决你遇到的广告加载失败问题。
内容的提问来源于stack exchange,提问作者user1785730
相关产品推荐
相关产品推荐

