首页 文章

插页式Admob广告:“IllegalStateException:只有全屏活动可以请求定位”

提问于
浏览
67

背景

我有一个使用Admob SDK的应用,用于显示插页式广告(全屏广告) .

最近谷歌已经更新了SDK以及许多其他东西(构建工具,gradle插件,IDE等),包括admob(firebase ads) .

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

我说它可能不需要,因为我不能在教程中看到它,即使我记得我过去做过:

我尝试了什么

  • 我试图删除清单条目 . 还是同样的问题 .

  • 我试图通过强制将主题设置为“@android:style / Theme.Translucent.NoTitleBar.Fullscreen”,但它也没有帮助 .

  • 我甚至认为这可能是因为我目前拥有Android 8.1,但是当我尝试使用Play商店中的应用时,我发现它工作得很好,没有崩溃 .

  • 我试图回到admob的版本11.2.2并使用gradle v 2.3.3,但它也没有帮助 .

  • 尝试使用Android 7.0的模拟器时,它可以正常使用最新版本的所有内容,并删除整个清单活动标记 .

  • 我试图在gradle文件中使用它,而不是我使用的:

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

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

  • 最后,我尝试使用Android 8.1在模拟器上运行应用程序,并且它在真实设备上崩溃了 .

  • 向Google Admob小组报告此事,以及Android issue tracker . 我希望他们能回答我这件事 .

问题

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

是因为Android 8.1吗?如果是这样,为什么旧版本的应用程序运行良好?我试图将那些旧版本的版本还原,但它仍然崩溃了 .

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

7 回答

  • -1

    似乎升级到:

    com.google.firebase:firebase-ads:15.0.1
    

    为我解决了这个问题 . 我刚刚在带有8.1.0的Nexus 5X上进行了测试,现在还有插页式Admob广告 .

    更完整的解决方案

    app的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'
    
            ...
        }
    }
    
    ...
    
  • 62

    EDIT

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

    com.google.firebase:firebase-ads:17.1.2
    

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

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

    将目标设置为Android API Level以解决问题,等待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");
            ....
            }
    

    这一变化已在this commit中引入

    防止非全屏活动影响方向此更改列表强制执行以O及更高为目标的活动只能在全屏时指定方向 .

    并且可能在admob lib中搞砸了一些检查

  • 0

    尝试在清单中添加此内容

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

    请不要在Android Manifest文件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复制并粘贴到您的项目中 .

  • 2

    当广告小部件更新其API广告时,系统会自动修复此问题,因为他们的广告相关性不支持API 27,因此会出现此问题 .

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

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

    如果你已经设置了目标sdk版本27然后你会得到这个错误,实际上android更新sdk非常快,并且一些更新admob留下来做,与android sdk集成,所以admob等待这个更新,他们应该很快这样做,它不是开发人员方面的问题,如果你想逃离这次崩溃,那么将你的sdk设置为26 .

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

  • 1

    在Android Oreo中您无法通过代码更改方向,因此您可以在更改方向时进行检查


    if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    
                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                }
    

相关问题