升级targetSdkVersion至31后主界面AdMob banner广告无法加载如何解决
问题关联判定
你遇到的banner1曝光量骤降问题和Android Studio抛出的权限报错直接相关。升级到targetSdkVersion 31(对应Android 12系统)后,系统权限检查逻辑、AdMob SDK的适配规则都发生了变化,你看到的lint报错不是单纯的误报,对应的底层兼容性问题会导致运行在Android 12及以上设备上的banner1广告请求被拦截,无法正常加载,最终表现为曝光量暴跌。而banner2能正常加载是因为ListActivity的启动时机、上下文环境和MainActivity存在差异,仅部分低版本系统设备不受该问题影响,贡献了你看到的少量banner1曝光。
报错修复方案
按以下步骤逐一排查修复即可:
1. 修正Manifest权限配置
- 确认
android.permission.INTERNET权限声明在<manifest>根标签下,不要嵌套在<application>等其他标签内部,targetSdk 31后权限声明位置错误会直接被系统忽略。 - 新增AD_ID权限声明(targetSdk 31+的强制要求,AdMob 20.4.0及以上版本必须配置才能正常拉取广告):
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
2. 升级AdMob SDK到适配版本
你当前使用的AdMob SDK版本未适配Android 12,是导致权限识别错误的核心原因之一。将play-services-ads依赖升级到20.6.0及以上的正式版本,该版本开始完整支持targetSdkVersion 31,修复了旧版本在高版本系统上的兼容性问题。
3. 修复lint报错与广告加载顺序
Android Studio对targetSdk 31下的AdMob loadAd方法存在lint检查误判,你可以通过添加忽略注解解决报错,同时修正广告加载的执行顺序(先设置AdListener再调用loadAd,避免回调丢失),修改后的代码如下:
MobileAds.initialize(this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) { } }); AdRequest adRequest = new AdRequest.Builder().build(); // 先设置监听器再加载广告 mAdView.setAdListener(new AdListener(){ @Override public void onAdLoaded() { super.onAdLoaded(); new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { @Override public void run() { loadingAdAlert.setVisibility(View.GONE); mAdView.setVisibility(View.VISIBLE); } }, 1500); } @Override public void onAdFailedToLoad(LoadAdError loadAdError) { super.onAdFailedToLoad(loadAdError); // 建议此处添加日志打印loadAdError的错误码与信息,方便后续排查异常 loadingAdAlert.setVisibility(View.GONE); } }); // 添加lint忽略注解解决权限报错提示 @SuppressLint("MissingPermission") mAdView.loadAd(adRequest);
4. 验证MainActivity初始化逻辑
确认MainActivity启动时MobileAds.initialize方法正常触发,没有因为升级targetSdk 31后新增的组件启动拦截规则、生命周期变化导致初始化未完成就调用广告加载逻辑。
内容的提问来源于stack exchange,提问作者JP711

