为什么部分设备上AdMob的AppOpenAd展示时会显示状态栏
AppOpenAd在部分设备展示时显示状态栏问题排查与解决
问题现象
在三星A20s、Nexus 5x等部分设备上展示AppOpenAd开屏广告时,会出现状态栏无法隐藏、残留显示的异常,效果如下图:
触发原因
- 系统层级适配差异:出现异常的设备大多运行Android 9及以下版本,或是搭载了厂商深度定制的ROM,这类系统对
FLAG_FULLSCREEN全屏窗口标记的处理逻辑做了定制修改,AppOpenAd默认申请的全屏权限无法强制隐藏状态栏,导致状态栏残留。 - AdMob SDK版本漏洞:21.0.0以下版本的AdMob SDK中,AppOpenAd对应的广告Activity没有适配低版本及定制ROM的全屏逻辑,仅依赖系统默认全屏标记生效,未主动设置状态栏隐藏、透明属性,导致适配失败。
- 宿主App主题冲突:如果宿主App的Application层级主题配置了强制显示状态栏、状态栏不透明等属性,会优先覆盖广告Activity的部分配置,导致隐藏状态栏的逻辑失效。
可行解决方案
方案1:升级AdMob SDK到最新稳定版
Google官方在21.0.0及以上版本的AdMob SDK中已经修复了该适配问题,优先推荐升级依赖解决,Gradle配置参考:
dependencies { // 替换为当前官方最新稳定版即可 implementation 'com.google.android.gms:play-services-ads:22.6.0' }
方案2:覆盖广告Activity主题(适配无法升级SDK的场景)
如果业务侧暂时无法升级SDK,可以通过自定义主题强制指定广告页面全屏属性:
- 在
res/values/styles.xml中添加全屏自定义主题:
<style name="AppOpenAdFullScreenTheme" parent="Theme.AppCompat.NoActionBar"> <item name="android:windowFullscreen">true</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowContentOverlay">@null</item> </style>
- 在
AndroidManifest.xml中覆盖AdMob广告Activity的主题配置:
<activity android:name="com.google.android.gms.ads.AdActivity" android:theme="@style/AppOpenAdFullScreenTheme" tools:replace="android:theme"/>
方案3:动态强制隐藏状态栏
如果上述方案仍有少量设备适配失败,可以在广告展示的回调中主动修改窗口参数,强制隐藏状态栏:
// Java实现示例 appOpenAd.show(activity, new FullScreenContentCallback() { @Override public void onAdShowedFullScreenContent() { Window window = activity.getWindow(); if (window != null) { window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); } } });
// Kotlin实现示例 appOpenAd.show(activity, object : FullScreenContentCallback() { override fun onAdShowedFullScreenContent() { activity.window?.run { decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) } } })
内容的提问来源于stack exchange,提问作者Andriy D.
相关产品推荐
相关产品推荐

