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

使用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是较旧版本,可能依赖部分明文请求,导致广告请求被系统拦截。

解决步骤:

  1. 在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>
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:32:45