测试时模拟器无法加载Banner广告,错误代码3的解决求助
问题描述
在模拟器测试应用Banner广告时无法显示,出现以下错误日志:
I/Ads: Ad failed to load : 3
W/ConnectionStatusConfig: Dynamic lookup for intent failed for action: com.google.android.gms.ads.service.CACHE
W/ConnectionStatusConfig: Dynamic lookup for intent failed for action: com.google.android.gms.ads.service.START
使用官方Demo广告单元可正常显示,但自定义广告单元无法加载。
相关代码与配置
Java代码
package com.devdroid.adsample; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdView; import com.google.android.gms.ads.MobileAds; public class MainActivity extends AppCompatActivity { AdView adView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); adView = findViewById(R.id.adView); MobileAds.initialize(this); AdRequest adRequest = new AdRequest.Builder().build(); adView.loadAd(adRequest); } }
XML布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.google.android.gms.ads.AdView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/adView" app:adSize="BANNER" app:adUnitId="@string/banner_ad_unit_id" android:layout_alignParentBottom="true" /> </RelativeLayout>
Manifest配置
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/Theme.AdSample" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="@string/app_id" /> </application> </manifest>
Strings.xml
<resources> <string name="app_name">AdSample</string> <string name="app_id">XXXXXXXX</string> <string name="banner_ad_unit_id">XXXXXXXX</string> </resources>
解决方案
1. 校验自定义广告单元配置
- 登录AdMob后台,确认自定义Banner广告单元处于启用状态,未启用的单元会直接返回加载失败。
- 核对广告单元类型与代码中
adSize参数是否匹配,确保都是Banner类型,避免尺寸不兼容。
2. 解决错误码3(无填充)问题
错误码3表示广告请求无可用填充,可按以下步骤处理:
- 确认
strings.xml中的app_id与AdMob后台注册的应用ID完全一致,不要误填成广告单元ID。 - 新创建的广告单元需要数小时的初始化时间,等待一段时间后再测试。
- 在模拟器测试时,添加测试设备ID到AdMob后台测试设备列表,或在代码中通过
AdRequest.Builder().addTestDevice("你的设备ID")添加测试设备,避免非测试流量被限制。
3. 修复Google Play服务警告
日志中的Intent查找失败警告,多因模拟器Google Play服务异常导致:
- 使用包含完整Google服务的系统镜像(如Google APIs镜像),并将Google Play服务更新到最新版本。
- 确保项目依赖的
play-services-ads版本与模拟器中的Google Play服务版本兼容,建议使用最新稳定版。
4. 优化代码逻辑
- 调整初始化逻辑,确保AdMob初始化完成后再加载广告:
MobileAds.initialize(this, initializationStatus -> { AdRequest adRequest = new AdRequest.Builder().build(); adView.loadAd(adRequest); });
- 添加广告加载失败监听,获取详细错误信息便于排查:
import com.google.android.gms.ads.AdListener; import com.google.android.gms.ads.LoadAdError; import android.util.Log; // 在loadAd前添加监听 adView.setAdListener(new AdListener() { @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { super.onAdFailedToLoad(loadAdError); Log.e("AdLoadError", "错误码:" + loadAdError.getCode() + ",详情:" + loadAdError.getMessage()); } });
5. 检查网络环境
- 确认模拟器已连接稳定网络,未开启代理或VPN导致广告请求被拦截。
内容的提问来源于stack exchange,提问作者Vibhav Gupta
相关产品推荐
相关产品推荐

