间隙广告: “ IllegalStateException: 只有全屏活动可以请求方向”

背景资料

我有一个应用程序与 Admob SDK 使用在它,显示间隙广告(全屏广告)。

最近 Google 更新了 SDK,还有很多其他的东西(构建工具、 gradle 插件、 IDE 等等)。.)包括 admob (火焰基地广告)。

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. 我试图强行将主题设置为“@android: style/Theme. Translucent.NoTitleBar. Fullscreen”,但也没有用。

  3. 我甚至认为这可能是因为我现在使用的是 Android 8.1,但是当我尝试使用播放商店的应用程序时,我注意到它工作得很好,没有崩溃。

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

  5. 在使用 Android 7.0的模拟器上进行测试时,所有东西的最新版本都能正常工作,清除了所有的清单活动标签。

  6. 我试图用这个来代替我使用的渐变文件:

    编译‘ 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吗?如果是这样,为什么旧版本的应用程序运行良好?我试过把很多版本还原成旧的,但还是崩溃了。

最重要的是,我该怎么解决?

26677 次浏览

剪辑

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

com.google.firebase:firebase-ads:17.1.2

将目标版本设置为最新版本,如果您已经使用了前面建议的解决方案。

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

将目标设置为 AndroidAPI 级别为26以修复该问题,等待 Admob 更新

建筑,梯度

targetSdkVersion 26

如果 targetSdkVersion > = 27(> android.os.Build.VERSION_CODES.O = 26)你会得到这个错误,他们已经在最新的 Android 版本中修改了 活动纪录,添加了以下内容:

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

这个承诺中已经引入了更改

防止非全屏活动影响方向 变更列表强制针对 O 及以上目标的活动只能 如果它们是全屏的,指定一个方向。

很可能在 admob lib 搞砸了一些支票

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

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

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

如果你已经设置了目标 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

在清单中,确保该活动的声明为

android:theme="@style/TranslucentTheme"

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

请从清单文件中的 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-> Apps-> your App-> App Settings-> App Id 得到应用 ID。请将此 App _ Id 复制并粘贴到项目中。

似乎升级到:

com.google.firebase:firebase-ads:15.0.1

我已经解决了这个问题。我刚刚在 Nexus5X 上用8.1.0测试了一下,现在可以使用间隙广告了。

更完整的解决方案:

应用程序的 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'

顶级建筑等级:

buildscript {
...


dependencies {
...


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


...
}
}


...

在安卓奥利奥系统中,你不能通过代码来改变方向,所以无论何时改变方向,你都要进行检查


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