插页式AdMob广告:“IllegalStateException:只有全屏活动才能请求定位”

背景

我有一个Admob SDK的应用程序,用来显示插页式广告(全屏广告)。

谷歌已经更新了SDK,以及其他许多东西(构build工具,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 

事情是,它以前工作得很好。 现在我不确定是什么原因引起的。

在网上search,我没有看到任何关于“只有全屏活动才能请求定位”的内容。

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

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

我说这可能是不需要的,因为在教程中我再也看不到它了,尽pipe我记得过去我曾经这样做过:

  • https://developers.google.com/admob/android/quick-start
  • https://developers.google.com/admob/android/interstitial

我试过了

  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的模拟器上进行testing时,它能够正常运行,并且移除了整个清单活动标签。

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

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

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

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

  2. 向Google Admob团队报告了这个问题 ,以及Android问题跟踪器 。 我希望他们能回答我这个问题。

问题

这个问题的原因是什么?

是因为Android 8.1吗? 如果是这样的话,老版本的应用程序如何运行良好? 我试图在很多版本中恢复旧版本,但仍然崩溃。

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

Solutions Collecting From Web of "插页式AdMob广告:“IllegalStateException:只有全屏活动才能请求定位”"

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

在build.gradle

 targetSdkVersion 26 

如果targetSdkVersion是> = 27( > android.os.Build.VERSION_CODES.O )你得到这个错误,他们改变了ActivityRecord在最新的Android版本添加这个:

 void setRequestedOrientation(int requestedOrientation) { if (ActivityInfo.isFixedOrientation(requestedOrientation) && !fullscreen && appInfo.targetSdkVersion > O) { throw new IllegalStateException("Only fullscreen activities can request orientation"); .... } 

这个改变已经在这个提交中引入了

防止非全屏活动影响方向此更改列表强制定位O及其以后的活动只能在全屏时指定方向。