72

背景

我有一个使用 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 问题跟踪器报告了此事。我希望他们能回答我这个问题。

问题

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

是因为安卓8.1吗?如果是这样,该应用程序的旧版本如何运行良好?我试图将很多版本恢复为旧版本,但它仍然崩溃。

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

4

7 回答 7

63

编辑

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

com.google.firebase:firebase-ads:17.1.2

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

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

将目标设置为 Android API Level 为 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 中搞砸了一些检查

于 2017-10-28T23:53:53.183 回答
44

编辑

较新的(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"
于 2018-02-07T13:54:20.167 回答
3

请不要使用 Android Manifest 文件 AdActivity 中的任何属性。

请从 Manifest 文件中的 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 复制并粘贴到您的项目中。

于 2018-03-03T04:50:40.693 回答
2

当 ad mob 为 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。

于 2017-12-28T05:13:18.740 回答
1

似乎升级到:

com.google.firebase:firebase-ads:15.0.1

为我解决了这个问题。我刚刚在带有 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'

顶级 build.gradle:

buildscript {
    ...

    dependencies {
        ...

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

        ...
    }
}

...
于 2018-05-19T10:24:42.483 回答
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)并且不再发生崩溃。

于 2019-01-04T22:58:48.853 回答
-1

In Android Oreo You can't change the orientation by code so you have check whenever change the orientation


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

                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
于 2018-07-19T06:35:46.203 回答