AdMob测试横幅广告无法加载问题求助
我正在练习加载AdMob横幅广告,但广告无法显示。已确认build.gradle(:app)、build.gradle(:project)及Manifest文件均配置完成,Manifest中已填写AdMob后台创建的APP ID,应用运行无报错但广告不显示,Logcat出现相关错误日志。
相关代码
XML布局代码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" xmlns:ads="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <com.google.android.gms.ads.AdView android:id="@+id/adView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" ads:adSize="BANNER" ads:adUnitId="ca-app-pub-3940256099942544/6300978111" /> </LinearLayout>
注:使用了AdMob官方提供的测试横幅广告单元ID
MainActivity.java代码
import androidx.annotation.NonNull; 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; import com.google.android.gms.ads.RequestConfiguration; import com.google.android.gms.ads.initialization.InitializationStatus; import com.google.android.gms.ads.initialization.OnInitializationCompleteListener; import java.util.Arrays; import java.util.List; import static com.google.android.gms.ads.MobileAds.initialize; public class MainActivity extends AppCompatActivity { private AdView mAdView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MobileAds.initialize(this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(@NonNull @org.jetbrains.annotations.NotNull InitializationStatus initializationStatus) { } }); /* List<String> testDeviceIds = Arrays.asList("") RequestConfiguration configuration = new RequestConfiguration.Builder().setTestDeviceIds(testDeviceIds).build(); MobileAds.setRequestConfiguration(configuration);*/ mAdView = findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder() .build(); mAdView.loadAd(adRequest); } }
注:注释部分为尝试的解决方案,但未收到获取测试设备ID的日志提示,无法填写设备ID
Logcat日志
I/Ads: Ad failed to load : 0
E/DynamiteModule: Failed to load IDynamiteLoader from GmsCore: Application package com.google.android.gms not found
解决方案
修复Google Play Services缺失问题
日志中的com.google.android.gms not found是核心问题,说明设备上没有安装或未正确更新Google Play服务:- 模拟器:必须使用带Google Play标识的系统镜像创建模拟器,启动后更新Google Play服务到最新版本。
- 真机:打开Google Play商店,搜索并更新Google Play服务,确保版本与项目依赖的
play-services-ads版本兼容。
延迟广告加载到初始化完成后
当前代码中loadAd在初始化异步操作未完成时就执行,可能导致SDK未就绪。修改代码,将广告加载逻辑移到初始化回调内:MobileAds.initialize(this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(@NonNull InitializationStatus initializationStatus) { mAdView = findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder().build(); mAdView.loadAd(adRequest); } });获取并配置测试设备ID
Google Play服务正常后,运行应用,Logcat会输出类似Use AdRequest.Builder.addTestDevice("DEVICE_ID") to get test ads on this device.的日志,复制该ID启用测试设备配置(代码放在MobileAds.initialize之前):List<String> testDeviceIds = Arrays.asList("你的测试设备ID"); RequestConfiguration configuration = new RequestConfiguration.Builder().setTestDeviceIds(testDeviceIds).build(); MobileAds.setRequestConfiguration(configuration);修正布局无效属性
XML中AdView的android:layout_alignParentBottom="true"属于RelativeLayout属性,在LinearLayout中无效。若要固定广告在底部,可通过权重调整布局:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ... android:orientation="vertical"> <TextView ... android:layout_weight="1"/> <!-- 让文本区域占满剩余空间,广告固定在底部 --> <com.google.android.gms.ads.AdView .../> </LinearLayout>
内容的提问来源于stack exchange,提问作者josephyumss

