插页式 Admob 广告:"IllegalStateException: Only fullscreen activities can request orientation"

Interstitial Admob ads: "IllegalStateException: Only fullscreen activities can request orientation"

背景

我有一个使用 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

问题是它以前工作得很好。现在我不确定是什么原因导致的。

在网上搜索,我没有看到任何关于 "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"/>

我说它可能不需要,因为我在教程中再也看不到它了,尽管我记得我过去做过:

我试过的

  1. 我试图删除清单条目。还是一样的问题。

  2. 我试过强行把主题设置成“@android:style/Theme.Translucent.NoTitleBar.Fullscreen”,也没用。

  3. 我什至认为这可能是因为我目前有 Android 8.1,但是当我尝试使用 Play 商店中的应用程序时,我发现它运行良好,没有崩溃。

  4. 我试着回到 admob 的 11.2.2 版本并使用 gradle v 2.3.3 ,但它也没有帮助。

  5. 在使用 Android 7.0 的模拟器上尝试时,它在最新版本的所有内容上运行良好,并删除了整个清单 activity 标签。

  6. 我试图在 gradle 文件中使用它,而不是我使用的 :

    编译'com.google.android.gms:play-services-ads:11.4.2'

在我的设备上仍然崩溃(Nexus 5x with Android 8.1)但在模拟器上没有崩溃。

  1. 最后,我尝试 运行 使用 Android 8.1 的模拟器上的应用程序,它崩溃了,就像在真实设备上一样。

  2. 向 Google Admob 团队以及 Android issue tracker 报告了此事。我希望他们能回答我这个问题。

问题

导致此问题的原因可能是什么?

是因为Android8.1吗?如果是这样,为什么旧​​版本的应用程序运行良好?我试图将那里的很多版本还原为旧版本,但它仍然崩溃。

而且,最重要的是,我该如何解决它?

编辑

现在有更新的 admob 版本可用。 我确认使用最新版本(15.0.1 或更高版本)问题不再出现,因此您可以使用最新版本的 Admob

com.google.firebase:firebase-ads:17.1.2

如果您使用了之前建议的解决方法,请将目标版本设置为最新版本。

---------------------------------------- ------------------

将目标设置为Android API 级别为26以解决问题,等待Admob更新

在build.gradle

targetSdkVersion 26

如果 targetSdkVersion 是 >=27(> android.os.Build.VERSION_CODES.O 即 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

中引入

Prevent non-fullscreen activities from influencing orientation This changelist enforces that activities targeting O and beyond can only specify an orientation if they are fullscreen.

并且可能在 admob 库中弄乱了一些检查

当广告暴民更新他们的广告 sdk 时,这个问题将自动解决 API 27 他们的广告依赖不支持 API 27 所以由于这个问题发生。

 compile 'com.google.android.gms:play-services-ads:11.8.0'

只有全屏活动可以请求方向,这是由于您的 mainfest 文件中的广告元数据,admob 应该将其 sdk 更新为 27 版本。

如果你设置了目标 sdk 版本 27 那么你会得到这个错误,实际上 android 更新 sdk 非常快,还有一些更新 admob 留下来做,为了与 android sdk 集成,所以 admob 有待更新,他们应该很快就会这样做,这不是开发人员方面的问题,如果你想避免这次崩溃,请将你的 sdk 设置为 26。

编辑

更新的(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

并且在清单中,确保 activity 声明为

android:theme="@style/TranslucentTheme"

请不要使用 Android 清单文件 AdActivity 中的任何属性。

请从清单文件中的 AdActivity 中删除此行

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

只需将以下行添加到 Android 清单文件即可。

    <activity android:name="com.google.android.gms.ads.AdActivity" />

如果您想将所需 activity 设置为纵向模式,请将以下行添加到您的活动 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 复制并粘贴到您的项目中。

好像升级到:

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'

        ...
    }
}

...

在 Android Oreo 中您不能通过代码更改方向,因此您必须在更改方向时进行检查


  if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {

                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }

我在使用 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),崩溃不再发生。