插页式Admob广告:“ IllegalStateException:仅全屏活动可以请求定向”


71

背景

我有一个使用了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. 我试图强行将主题设置为“ @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'

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

  1. 最终,我尝试在具有Android 8.1的模拟器上运行该应用程序,并且该应用程序崩溃了,就像在真实设备上一样。

  2. 向Google Admob小组以及Android问题跟踪器报告了此问题。我希望他们能就此回答我。

问题

造成此问题的原因可能是什么?

是因为Android 8.1吗?如果是这样,那么较旧版本的应用程序如何正常运行?我试图将许多版本恢复为旧版本,但仍然崩溃。

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


我认为他们应该发布针对8.1版本的播放服务库,其中将包含此修复程序。(他们只发布了一个支持库,而当有sdk更新时,它们通常会同时发布支持和播放服务库)
meh

半年过去了,问题仍然存在:| 尝试使用最新版本firebase-ads:11.8.0
Vasily Kabunov,

Answers:


1

似乎升级到:

com.google.firebase:firebase-ads:15.0.1

为我解决了这个问题。我刚刚在Nexus 5X上使用8.1.0进行了测试,并且Interstitial 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开发人员

63

编辑

现在可以使用更新的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");
        ....
        }

此提交已引入更改

防止非全屏活动影响方向此更改列表强制执行针对O及以后的活动,如果它们是全屏则只能指定方向。

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


15
他们为什么要添加此限制,即仅针对全屏活动就可以更改方向?没道理 无论是全屏还是全屏,应用程序都应自行决定是横向还是纵向。
Android开发人员

2
好的,在此处发出了删除此限制的请求:issuetracker.google.com/issues/68454482
android开发人员

看来这解决了问题,但是何时会出现此问题?当我将targetSdk设置为新的时,如何避免呢?
Android开发人员

@androiddeveloper你应该能够避免它,如果没有指定任何明显的方向相关的非全屏活动
Silverstorm

5
我使用15.0.1,但问题仍然在某些Android 8设备上仍然存在,但不是全部,可能是因为它们使用旧的Google Play服务版本
Wayne

45

尝试将其添加到清单中

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

1
最好使用Theme.Translucent.NoTitleBar.Fullscreen,因为的原始主题AdActivityTheme.Translucent
Khang .NT

1
他们为什么不将其作为最高优先级来解决?经过数小时的研究和由于崩溃导致用户不满意之后,成千上万的开发人员都必须完全正确地解决此问题,这是荒谬的。–
Doctorram

此答案的另一个变体可能会更好地起作用:issuetracker.google.com/issues/68427483#comment31
Gabor

@ Khang.NT-此解决方案的问题是特定主题(Theme.Translucent.NoTitleBar.Fullscreen)导致此崩溃...出于某些原因。所以我认为对我们来说
不透明

但是,如果我不希望我的应用全屏显示怎么办?
火星

3

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

请从清单文件的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->应用程序->您的应用程序->应用程序设置->应用程序ID获取应用程序ID。请将此App_Id复制并粘贴到您的项目中。


不适用于我:Google服务4.0.1 / firebase-ads 17.0.0 / API 28 Pie
Aldasa

也没有为我解决:google services 4.0.1 / firebase-ads 17.1.1 / API 28 Pie
TomV

2

当广告暴民为API 27更新其广告sdk时,此问题将自动修复,其广告依赖项不支持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。


可以触发代码崩溃的命令到底是什么?以及为什么这种怪异的限制?
Android开发人员

仅仅由于admob不会更新,它将由于admob方面的后期更新而更新他们依赖android 8.0显示广告的依赖性。可能需要几个星期。那将是正确的。
纳杰夫·阿里

您从何处获得此屏幕截图?它是否表示将在此版本中应用此修复程序以及哪个版本的Admob?
Android开发人员

3
Google小组到底还没有解决这个问题?这是一个非常简单的修补程序-对于导致使用SDK的每个人造成重大干扰的问题已有一个多月了。我认为12月18日的更新已解决。在Android Studio中,AVD中不再发生崩溃,但是通过查看最新的崩溃报告-库中尚未解决此问题。无法支持最新的操作系统非常令人沮丧。
大卫·韦斯特

2
大。我们被告知要尽快升级SDK。我们做到了,我们受到了惩罚。
Kimi Chiu

1

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


Vungle和Adodeal是否可以替代Admob?你为什么提到他们?而且,说到它们,它们是不错的选择吗?他们是否有一个应用程序向您展示他们的表现(例如Admob:play.google.com/store/apps/…)?
Android开发人员

@androiddeveloper,我提到了Vungle和Appodeal,是因为我遇到了与该问题相同的例外(试图找出是什么原因造成的),只是它与另一个广告网络有关。分享了我的发现,以防其他人遇到像我这样的问题。我认为这是否可以代替Admob取决于个人情况,因此我无法提供建议。但是它们可以与Admob一起使用。
Adomas'1

-1

在Android Oreo中,您无法通过代码更改方向,因此无论何时更改方向都需要检查


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

                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }

你确定吗?另外,您确定它不仅是Android 8.0上的怪异错误,而且不会在8.1及更高版本上发生吗?
Android开发人员
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.