插页式Admob广告:"IllegalStateException:只有全屏活动可以请求定位"

and*_*per 71 android admob android-8.1-oreo

背景

我有一个使用Admob SDK的应用,用于显示插页式广告(全屏广告).

最近谷歌已经更新了SDK以及许多其他东西(构建工具,gradle插件,IDE等),包括admob(firebase ads).

compile 'com.google.firebase:firebase-ads:11.4.2'
Run Code Online (Sandbox Code Playgroud)

问题

更新后,我注意到每当应用尝试展示插页式广告时,它都会崩溃.

崩溃日志是这样的:

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
Run Code Online (Sandbox Code Playgroud)

事情是,它之前工作得很好.现在我不确定是什么导致它发生.

在网上搜索,我没有看到任何谈论"只有全屏活动可以请求定位"的内容.

我在清单中所拥有的东西有点陈旧,可能不再需要了:

    <activity
        android:name="com.google.android.gms.ads.AdActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
        android:theme="@android:style/Theme.Translucent"/>
Run Code Online (Sandbox Code Playgroud)

我说它可能不需要,因为我不能在教程中看到它,即使我记得我过去做过:

我试过的

  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的模拟器时,它可以正常使用最新版本的所有内容,并删除整个清单活动标记.

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

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

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

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

  2. 向谷歌Admob团队报告此事,以及Android问题跟踪器.我希望他们能回答我这件事.

问题

这个问题可能是什么原因?

是因为Android 8.1吗?如果是这样,为什么旧​​版本的应用程序运行良好?我试图将那些旧版本的版本还原,但它仍然崩溃了.

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

Sil*_*orm 63

编辑

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

com.google.firebase:firebase-ads:17.1.2
Run Code Online (Sandbox Code Playgroud)

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

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

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

在build.gradle中

targetSdkVersion 26
Run Code Online (Sandbox Code Playgroud)

如果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");
        ....
        }
Run Code Online (Sandbox Code Playgroud)

此提交中引入了更改

防止非全屏活动影响方向此更改列表强制执行以O及更高为目标的活动只能在全屏时指定方向.

并且可能在admob lib中搞砸了一些检查

  • 为什么他们会添加这个限制,能够改变全屏活动的方向?没有意义.应用程序应该自行决定它是横向还是纵向,无论它是否全屏. (15认同)
  • 我使用的是15.0.1,但问题仍然存在于某些Android 8设备上并非全部,可能是因为它们使用的是旧的Google Play服务版本 (5认同)
  • 好的,请在此处写下删除此限制的请求:https://issuetracker.google.com/issues/68454482 (2认同)

Oma*_*oud 45

尝试在清单中添加此内容

<activity
android:name="com.google.android.gms.ads.AdActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
tools:replace="android:theme"
 />
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用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
Run Code Online (Sandbox Code Playgroud)

在清单中,确保声明活动

android:theme="@style/TranslucentTheme"
Run Code Online (Sandbox Code Playgroud)


Zie*_*iem 1

看来升级到:

com.google.firebase:firebase-ads:15.0.1
Run Code Online (Sandbox Code Playgroud)

为我解决了这个问题。我刚刚在 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'
Run Code Online (Sandbox Code Playgroud)

顶层build.gradle:

buildscript {
    ...

    dependencies {
        ...

        classpath 'com.google.gms:google-services:3.3.0'

        ...
    }
}

...
Run Code Online (Sandbox Code Playgroud)