插页式 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 (&gt; android.os.Build.VERSION_CODES.Othat 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:只有全屏活动可以请求方向”的主要内容,如果未能解决你的问题,请参考以下文章

Monodroid 和 adMob 插页式广告

RecycleViewerAdapter 未完美显示 admob 插页式广告

AdMob插页式广告未加载

AdMob - 同一活动中的横幅和插页式广告 - 好不好?

如何使用“expo-ads-admob”在插页式广告中添加间隔

recyclerview 中的 admob 插页式广告实施不起作用?