Подтвердить что ты не робот

Межстраничные объявления Admob: "IllegalStateException: только действия в полноэкранном режиме могут запрашивать ориентацию"

Фон

У меня есть приложение с SDK Admob, используемое в нем, чтобы показывать объявления межстраничного объявления (полноэкранные объявления).

Недавно Google обновил SDK вместе со многими другими вещами (инструменты сборки, плагин gradle, IDE и т.д.), включая admob (объявления firebase).

compile 'com.google.firebase:firebase-ads:11.4.2'

Проблема

После обновления я заметил, что всякий раз, когда приложение пытается показать объявление Interstitial, оно сбой.

Журнал сбоев таков:

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, но когда я попытался использовать приложение из магазина воспроизведения, я заметил, что он работает нормально, без сбоев.

  • Я попытался вернуться к версии 11.2.2 admob и использовать gradle v 2.3.3, но это также не помогло.

  • При попытке эмулятора с Android 7.0 он отлично работал с последними версиями всего и удалением всего тега активности манифеста.

  • Я попытался использовать это в файле gradle вместо того, что я использовал:

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

Все еще разбился на моем устройстве (Nexus 5x с Android 8.1), но не сработал на эмуляторе.

  1. Наконец, я попытался запустить приложение на эмуляторе с Android 8.1, и он разбился так же, как на реальном устройстве.

  2. Сообщается об этом команде Google Admob, а также отслеживание проблем Android. Надеюсь, они ответят мне об этом.

Вопросы

Что может быть причиной этой проблемы?

Это из-за Android 8.1? Если да, то как пожилая версия приложения работает нормально? Я попытался вернуть туда много версий старым, но все равно разбился.

И, самое главное, как я могу его решить?

4b9b3361

Ответ 1

Кажется, что обновление до:

com.google.firebase:firebase-ads:15.0.1

решил этот вопрос для меня. Я только что протестировал его на Nexus 5X с 8.1.0, а объявления Interstitial 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'

        ...
    }
}

...

Ответ 2

РЕДАКТИРОВАТЬ

Теперь доступна новая версия 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), вы получаете эту ошибку, они изменили ActivityRecord в последней версии Android, добавив следующее:

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

Изменение было внесено в этот коммит

Предотвращение влияния не-полноэкранных действий на ориентацию. В этом списке изменений предусмотрено, что действия, ориентированные на О и далее, могут указывать ориентацию только в том случае, если они полноэкранные.

и, вероятно, в AdMob Lib испортили некоторые проверки

Ответ 3

попробуйте добавить это в свой манифест

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

Ответ 4

Эта проблема будет автоматически исправлена, когда рекламная банда обновит свои объявления sdk для API 27, а их зависимость от рекламы не поддерживает API 27, поэтому из-за этой проблемы.

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

Только полноэкранные действия могут запрашивать ориентацию, это связано с метаданными объявлений в вашем файле mainfest, admob должен обновить их sdk для версии 27. enter image description here

если вы установили целевую версию sdk 27, вы получите эту ошибку, на самом деле обновление sroid sroid очень быстро, и некоторые дополнения admob остались позади, для интеграции с android sdk, поэтому admob ждут этого обновления, они должны сделать это очень скоро, Не проблема на стороне разработчика, если вы хотите сбежать от этого сбоя, тогда установите sdk на 26.

Ответ 5

похоже, они все еще не обновили свой SDK, так как я получаю эту проблему в их последней версии sdk. compile 'com.google.android.gms: play-services-ads: 11.8.0'

Ответ 6

Пожалуйста, не используйте какие-либо свойства в файлах манифеста Android AdActivity.

удалите эту строку из AdActivity в файле манифеста

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

Просто добавьте следующую строку в файл манифеста Android.

    <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 → Приложения → Ваше приложение → Настройки приложения → Идентификатор приложения. Пожалуйста, скопируйте и вставьте этот App_Id в ваш проект.

Ответ 7

Я получил тот же сбой с 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) был 2.4.9-051218 более новый Vungle SDK (версия 6.3.12), и сбой больше не происходил.

Ответ 8

В Android Oreo Вы не можете изменить ориентацию по коду, чтобы вы проверяли, когда вы меняете ориентацию


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

                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }