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

时间:2017-10-28 18:02:39

标签: android admob android-8.1-oreo

背景

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

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

我尝试了什么

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

  2. 我尝试将主题设置为&#34; @android:style / Theme.Translucent.NoTitleBar.Fullscreen&#34;通过武力,但它也没有帮助。

  3. 我甚至认为这可能是因为我目前使用的是Android 8.1,但是当我尝试使用Play商店中的应用程序时,我发现它工作正常,没有崩溃。

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

  5. 尝试使用Android 7.0的模拟器时,它可以正常使用最新版本的所有内容,并删除整个清单活动标记。

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

    compile&#39; com.google.android.gms:play-services-ads:11.4.2&#39;

  7. 仍然在我的设备上崩溃(Nexus 5x与Android 8.1)但在仿真器上没有崩溃。

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

    2. 向Google Admob小组以及Android issue tracker报告此事。我希望他们能回答我这件事。

    3. 问题

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

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

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

6 个答案:

答案 0 :(得分:63)

修改

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

com.google.firebase:firebase-ads:17.1.2

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

<强> -------------------------------------------- --------------

将目标设置为Android API Level以解决问题,等待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

中引入
  

防止非全屏活动影响方向   changelist强制执行仅针对O及更高级别的活动   如果它们是全屏的,请指定方向。

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

答案 1 :(得分:43)

尝试在清单中添加此内容

<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"

答案 2 :(得分:2)

当广告小组更新API 27的广告时,系统会自动修复此问题 由于此问题的发生,他们的广告依赖性不支持API 27。

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

只有全屏活动可以请求定位,这是由于您的mainfest文件中的广告元数据,admob应该更新他们的sdk为27版本。 enter image description here

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

答案 3 :(得分:1)

似乎升级到:

com.google.firebase:firebase-ads:15.0.1

为我解决了这个问题。我刚刚在Nexus 5X上测试了8.1.0,并且插页式Admob广告现在正在使用。

更完整的解决方案:

app的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'

        ...
    }
}

...

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

在Android Oreo中,您无法通过代码更改方向,因此只要更改方向就可以检查


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

                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }