插页式 Admob 广告:“IllegalStateException:只有全屏活动可以请求方向”
Posted
技术标签:
【中文标题】插页式 Admob 广告:“IllegalStateException:只有全屏活动可以请求方向”【英文标题】:Interstitial Admob ads: "IllegalStateException: Only fullscreen activities can request orientation" 【发布时间】:2018-04-10 02:38:27 【问题描述】:背景
我有一个使用 Admob SDK 的应用,用于显示插页式广告(全屏广告)。
最近,Google 更新了 SDK 以及许多其他内容(构建工具、gradle 插件、IDE 等...),包括 admob(firebase 广告)。
compile 'com.google.firebase:firebase-ads:11.4.2'
问题
更新后,我注意到每当应用尝试展示插页式广告时,它都会崩溃。
崩溃日志是这样的:
10-28 14:01:01.394 4523-4523/... I/Ads: Ad opening.
10-28 14:01:01.400 1606-2154/? E/ActivityManager: Activity Manager Crash. UID:10080 PID:4523 TRANS:63
java.lang.IllegalStateException: Only fullscreen activities can request orientation
at com.android.server.am.ActivityRecord.setRequestedOrientation(ActivityRecord.java:2189)
at com.android.server.am.ActivityManagerService.setRequestedOrientation(ActivityManagerService.java:4975)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:1101)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2927)
at android.os.Binder.execTransact(Binder.java:697)
10-28 14:01:01.403 4523-4523/... D/AndroidRuntime: Shutting down VM
10-28 14:01:01.406 4523-4523/... E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo.../com.google.android.gms.ads.AdActivity: java.lang.IllegalStateException: Only fullscreen activities can request orientation
问题是它以前运行良好。现在我不确定是什么原因导致它发生。
在网上搜索,我没有看到任何关于“只有全屏活动可以请求方向”的内容。
我在清单中的东西有点旧,可能不再需要了:
<activity
android:name="com.google.android.gms.ads.AdActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:theme="@android:style/Theme.Translucent"/>
我说它可能不需要,因为我在教程中看不到它了,尽管我记得我过去做过:
https://developers.google.com/admob/android/quick-start https://developers.google.com/admob/android/interstitial我尝试过的
我试图删除清单条目。还是同样的问题。
我尝试强制将主题设置为“@android:style/Theme.Translucent.NoTitleBar.Fullscreen”,但也没有用。
我什至认为这可能是因为我目前使用的是 Android 8.1,但是当我尝试使用 Play 商店中的应用时,我发现它运行良好,没有崩溃。
我试图回到 admob 的 11.2.2 版本并使用 gradle v 2.3.3 ,但它也没有帮助。
在使用 Android 7.0 的模拟器上尝试时,它可以很好地处理最新版本的所有内容,并且删除了整个清单活动标签。
我尝试在 gradle 文件中使用它,而不是我使用的:
编译 'com.google.android.gms:play-services-ads:11.4.2'
在我的设备上仍然崩溃(带有 Android 8.1 的 Nexus 5x)但在模拟器上没有崩溃。
最后,我尝试在带有 Android 8.1 的模拟器上运行该应用程序,但它就像在真实设备上一样崩溃。
向 Google Admob 团队以及 Android issue tracker 报告了此问题。我希望他们能回答我这个问题。
问题
这个问题的原因可能是什么?
是因为 Android 8.1 吗?如果是这样,该应用程序的旧版本如何运行良好?我试图将很多版本还原为旧版本,但它仍然崩溃。
而且,最重要的是,我该如何解决?
【问题讨论】:
我认为他们应该发布面向 8.1 版本的播放服务库,其中将包含修复。 (他们只发布了一个支持库,当他们通常在有 sdk 更新时同时发布支持和播放服务库时) 半年过去了,问题依然存在 :|试过最新版firebase-ads:11.8.0
【参考方案1】:
编辑
现在有更新的 admob 版本可用。 我确认使用最新版本(15.0.1 或更高版本)问题不再出现,因此您可以使用最新版本的 Admob
com.google.firebase:firebase-ads:17.1.2
如果您使用了之前建议的解决方法,请将目标版本设置为最新版本。
------------------------------------------ --------------
将目标设置为 Android API Level 为 26 以修复问题,等待 Admob 更新
在 build.gradle 中
targetSdkVersion 26
如果targetSdkVersion
>=27 (> android.os.Build.VERSION_CODES.O
that is 26) 你得到这个错误,他们在最新的 Android 版本中改变了ActivityRecord 添加这个:
void setRequestedOrientation(int requestedOrientation)
if (ActivityInfo.isFixedOrientation(requestedOrientation) && !fullscreen
&& appInfo.targetSdkVersion > O)
throw new IllegalStateException("Only fullscreen activities can request orientation");
....
更改已在this commit 中引入
防止非全屏活动影响方向 更改列表强制针对 O 及以后的活动只能 如果它们是全屏的,请指定方向。
并且可能在 admob lib 中搞砸了一些检查
【讨论】:
他们为什么要添加这个限制,即只能为全屏活动更改方向?没有意义。应用应自行决定是横向还是纵向,无论是否全屏。 好的,在这里写了一个删除这个限制的请求:issuetracker.google.com/issues/68454482 这似乎解决了它,但这个问题什么时候出现?当我将 targetSdk 设置为新的时,我该如何避免它? @androiddeveloper 如果不在清单中为相关的非全屏活动指定任何方向,您应该能够避免它 我使用的是 15.0.1,但问题仍然存在于某些 Android 8 设备上,并非全部,可能是因为他们使用旧的 google play 服务版本【参考方案2】:编辑
较新的(16 以上)admob 版本修复了该问题
旧答案
尝试将其添加到您的清单中
<activity
android:name="com.google.android.gms.ads.AdActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
tools:replace="android:theme"
/>
或者,如果您使用的是 appcompat:
<style name="TranslucentTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
etc
并在清单中,确保活动声明为
android:theme="@style/TranslucentTheme"
【讨论】:
最好用Theme.Translucent.NoTitleBar.Fullscreen
,因为AdActivity
原来的主题是Theme.Translucent
他们为什么不把它作为最高优先级来解决呢?经过数小时的研究和由于崩溃导致用户不满意后,成千上万的开发人员都必须进行这个精确的修复,这太荒谬了....
这个答案的另一个变体可能会更好:issuetracker.google.com/issues/68427483#comment31
@Khang.NT - 这个解决方案的问题是这个特定的主题 (Theme.Translucent.NoTitleBar.Fullscreen) 导致了这个崩溃......出于某些原因。所以我认为我们没有半透明性:(
但如果我不希望我的应用全屏显示怎么办?【参考方案3】:
请不要使用 Android Manifest 文件 AdActivity 中的任何属性。
请从 Manifest 文件中的 AdActivity 中删除此行
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
只需将下面这一行添加到 Android Manifest 文件即可。
<activity android:name="com.google.android.gms.ads.AdActivity" />
如果您想将所需的活动设置为纵向模式,请将以下行添加到您的活动 onCreate 方法中:
if (android.os.Build.VERSION.SDK_INT != Build.VERSION_CODES.O)
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
对于 firebase ADS 17.0.0 及更高版本,请使用此行来清单文件。
<application
...........>
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="@string/app_id" />
</application>
您可以从 Admob -> 应用 -> 您的应用 -> 应用设置 -> 应用 ID 获取应用 ID。请将此 App_Id 复制并粘贴到您的项目中。
【讨论】:
没有为我修复:google services 4.0.1 / firebase-ads 17.0.0 / API 28 Pie 也没有为我修复:google services 4.0.1 / firebase-ads 17.1.1 / API 28 Pie【参考方案4】:当 ad mob 为 API 27 更新其广告 sdk 时,此问题将自动修复 他们的广告依赖不支持 API 27,因此出现了这个问题。
compile 'com.google.android.gms:play-services-ads:11.8.0'
只有全屏活动才能请求方向,这是由于您的 mainfest 文件中的广告元数据,admob 应该将其 sdk 更新为 27 版本。
如果你设置了target sdk version 27那么你会得到这个错误,实际上android更新sdk非常快,还有一些更新admob留下来做,为了与android sdk集成,所以admob有等待这个更新,他们应该做这很快,它不是开发者方面的问题,如果你想摆脱这次崩溃,请将你的 sdk 设置为 26。
【讨论】:
究竟是什么命令可以触发代码中的这个崩溃?为什么会有这种奇怪的限制? 只是由于 admob 没有更新,它会更新它们在 android 8.0 上显示广告的依赖关系,这只是由于 admob 端更新较晚。希望可能需要几周的时间。那么它就是正确的。 你从哪里得到这个截图?那里是否说将应用修复程序,以及在哪个版本的 Admob 上应用? Google 团队怎么还没解决这个问题?这是一个非常简单的解决方案 - 一个多月以来一直对使用 SDK 的每个人造成重大干扰的问题。我认为随着 12 月 18 日的更新,这已得到解决。 AVD 不再崩溃,在 Android Studio 中,但从查看最新的崩溃报告来看 - 这仍然没有在库中得到修复。无法支持最新的操作系统非常令人沮丧。 太棒了。我们被告知尽快升级 SDK。我们做到了,我们受到了惩罚。【参考方案5】:看来升级到:
com.google.firebase:firebase-ads:15.0.1
为我解决了这个问题。我刚刚在带有 8.1.0 的 Nexus 5X 上对其进行了测试,现在可以使用插页式 Admob 广告。
更完整的解决方案:
应用的 build.gradle:
...
android
compileSdkVersion 27
buildToolsVersion '27.0.3'
defaultConfig
...
targetSdkVersion 27
..
dependencies
...
implementation 'com.google.firebase:firebase-core:15.0.2'
implementation 'com.google.firebase:firebase-ads:15.0.1'
...
apply plugin: 'com.google.gms.google-services'
*** build.gradle:
buildscript
...
dependencies
...
classpath 'com.google.gms:google-services:3.3.0'
...
...
【讨论】:
是的,我也认为它已经修复了。【参考方案6】:我在使用 Vungle SDK(通过 Appodeal SDK 包含)时遇到了同样的崩溃,所以这并不能准确回答与 Admob SDK 相关的问题,但如果有人使用 Vungle 或 Appodeal SDK 得到这个问题:
版本如下:Appodeal SDK - 2.4.2-220518
,Vungle SDK - 6.2.5
。
升级到当时最新的 Appodeal SDK(版本2.4.9-051218
)后,包含了更新的 Vungle SDK(版本6.3.12
)并且不再发生崩溃。
【讨论】:
Vungle 和 Appodeal 是 Admob 的替代品吗?你为什么提到他们?而且,谈到它们,它们是很好的选择吗?他们是否有应用程序向您展示他们的表现(例如 Admob:play.google.com/store/apps/…)? @androiddeveloper,我提到了 Vungle 和 Appodeal,因为我遇到了与此问题相同的异常(试图找出原因),只是它与不同的广告网络有关。分享我的发现,以防其他人遇到像我这样的问题。我认为这取决于个人情况,如果它们是 Admob 的良好替代品,我无法就此提供建议。但它们可以与 Admob 一起使用。【参考方案7】:在 Android Oreo 中,您无法通过代码更改方向,因此您可以在更改方向时进行检查
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
【讨论】:
你确定吗?另外,您确定这不仅仅是 Android 8.0 上的一个奇怪错误,并且不会在 8.1 及更高版本上发生吗?以上是关于插页式 Admob 广告:“IllegalStateException:只有全屏活动可以请求方向”的主要内容,如果未能解决你的问题,请参考以下文章
RecycleViewerAdapter 未完美显示 admob 插页式广告