有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓 Interstitual Admob广告:“非法状态例外:只有全屏活动才能请求定向”

背景

我有一个使用Admob SDK的应用程序,用于显示间隙广告(全屏广告)

最近谷歌已经更新了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.安卓.server.am.ActivityRecord.setRequestedOrientation(ActivityRecord.java:2189)
                                                      at com.安卓.server.am.ActivityManagerService.setRequestedOrientation(ActivityManagerService.java:4975)
                                                      at 安卓.app.IActivityManager$Stub.onTransact(IActivityManager.java:1101)
                                                      at com.安卓.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2927)
                                                      at 安卓.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.安卓.gms.ads.AdActivity}: java.lang.IllegalStateException: Only fullscreen activities can request orientation

问题是它以前工作得很好。现在我不确定是什么导致了这种情况的发生

在网上搜索时,我没有看到任何关于“只有全屏活动才能要求定向”的内容

我在清单上看到的东西有点旧,可能不再需要了:

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

我说可能不需要它,因为我在教程中再也看不到它了,尽管我记得我以前看过:

我试过的

  1. 我试图删除清单条目。还是同一个问题

  2. 我试图强行将主题设置为“@安卓:style/theme.transparent.NoTitleBar.Fullscreen”,但也没用

  3. 我甚至认为这可能是因为我目前使用的是安卓8.1,但当我尝试使用play store中的应用程序时,我注意到它工作正常,没有崩溃

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

  5. 在使用Android 7.0的模拟器上进行测试时,它可以很好地处理最新版本的所有内容,并删除整个清单活动标记

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

    编译'com。谷歌。安卓gms:播放服务广告:11.4.2'

仍然在我的设备上崩溃(Nexus5x和Android 8.1),但没有在emulator上崩溃

  1. 最后,我尝试在带有Android 8.1的emulator上运行该应用程序,结果与在真实设备上一样崩溃

  2. 向谷歌Admob团队以及Android issue tracker报告了这一情况。我希望他们能回答我这个问题

问题

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

是因为安卓8.1吗?如果是这样的话,为什么旧版本的应用程序运行良好?我试图将那里的许多版本还原为旧版本,但它仍然崩溃

最重要的是,我该如何解决这个问题


共 (6) 个答案

  1. # 1 楼答案

    当ad mob为API 27更新其ads sdk时,此问题将自动修复 他们的ads依赖项不支持API 27,因此出现了此问题

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

    只有全屏活动才能请求定向,这是由于您的mainfest文件中有ads元数据,admob应将其sdk更新为27版本。 enter image description here

    如果你设置了target sdk version 27,那么你会遇到这个错误,实际上android非常快地更新sdk,还有一些更新admob留下来做,以便与android sdk集成,所以admob已经挂起了这个更新,他们应该很快做这件事,这不是开发者方面的问题,如果你想逃离这次崩溃,那么把sdk设置为26

  2. # 2 楼答案

    编辑

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

    com.google.firebase:firebase-ads:17.1.2
    

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

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

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

    内置。格拉德尔

    targetSdkVersion 26
    

    如果targetSdkVersion是>=27(> android.os.Build.VERSION_CODES.O也就是26)你得到这个错误,他们在最新的安卓版本中更改了ActivityRecord,添加了以下内容:

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

    这一变化已在this commit引入

    Prevent non-fullscreen activities from influencing orientation This changelist enforces that activities targeting O and beyond can only specify an orientation if they are fullscreen.

    也许在admob lib中,你弄乱了一些支票

  3. # 3 楼答案

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

    请从清单文件中的AdActivity中删除此行

    android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
    

    只需将下面这一行添加到Android清单文件中

        <activity android:name="com.google.android.gms.ads.AdActivity" />
    

    如果要将所需的活动设置为纵向模式,请在activities 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。请将此应用程序Id复制并粘贴到您的项目中

  4. # 4 楼答案

    我在Vungle SDK上也遇到了同样的崩溃(它是通过Appodale SDK提供的),因此这并不能准确回答与Admob SDK相关的问题,但如果有人在Vungle或Appodale SDK上遇到了这种情况:

    版本如下:AppodalSDK-2.4.2-220518,Vungle SDK-6.2.5。 升级到当时最新的Appodel SDK(版本2.4.9-051218)后,包含了更新的Vungle SDK(版本6.3.12),崩溃不再发生

  5. # 5 楼答案

    编辑

    更新的(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"
    
  6. # 6 楼答案

    似乎升级到:

    com.google.firebase:firebase-ads:15.0.1
    

    帮我解决了这个问题。我刚刚用8.1.0在Nexus 5X上测试了它,Admob广告现在也可以用了

    更完整的解决方案:

    应用程序的构建。格雷德尔:

    ...
    
    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'
    
            ...
        }
    }
    
    ...