Anuncios AdMob intersticiales: “IllegalStateException: solo las actividades de pantalla completa pueden solicitar orientación”

Fondo

Tengo una aplicación con Admob SDK utilizada en ella, para mostrar anuncios intersticiales (anuncios de pantalla completa).

Recientemente, Google ha actualizado el SDK, junto con muchas otras cosas (herramientas de comstackción, plugin de gradle, IDE, etc.), incluido admob (anuncios de Firebase).

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

El problema

Después de actualizar, noté que cada vez que la aplicación intenta mostrar un anuncio intersticial, se bloquea.

El registro de locking es como tal:

 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 

La cosa es que funcionó bien antes. Ahora no estoy seguro de qué causa esto.

Al buscar en la web, no vi nada que diga “Solo las actividades de pantalla completa pueden solicitar orientación”.

Lo que tenía en el manifiesto, es algo un poco viejo, que tal vez ya no sea necesario:

   

Digo que probablemente no sea necesario, porque ya no puedo verlo en los tutoriales, aunque recuerdo que lo hice en el pasado:

  • https://developers.google.com/admob/android/quick-start
  • https://developers.google.com/admob/android/interstitial

Lo que he intentado

  1. Traté de eliminar la entrada de manifiesto. Todavía el mismo problema.

  2. Intenté configurar el tema para que fuera “@android: style / Theme.Translucent.NoTitleBar.Fullscreen” por la fuerza, pero tampoco me ayudó.

  3. Incluso pensé que podría ser porque actualmente tengo Android 8.1, pero cuando traté de usar la aplicación en Play Store, noté que funcionó bien, sin fallas.

  4. Intenté volver a la versión 11.2.2 de admob y usar gradle v 2.3.3, pero tampoco me ayudó.

  5. Al probar un emulador con Android 7.0, funcionó bien con las últimas versiones de todo y la eliminación de toda la etiqueta de actividad del manifiesto.

  6. Intenté usar esto en un archivo gradle, en lugar de lo que usé:

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

Todavía se bloqueó en mi dispositivo (Nexus 5x con Android 8.1) pero no se colgó en el emulador.

  1. Finalmente, traté de ejecutar la aplicación en el emulador con Android 8.1, y se colgó igual que en el dispositivo real.

  2. Informó sobre esto al equipo de Google Admob, así como al rastreador de problemas de Android . Espero que me respondan sobre esto.

Las preguntas

¿Cuál podría ser la causa de este problema?

¿Es por Android 8.1? Si es así, ¿cómo es que la versión anterior de la aplicación funcionó bien? Traté de revertir allí muchas versiones a las antiguas, pero aún así se bloqueó.

Y, lo más importante, ¿cómo puedo resolverlo?

Parece que la actualización a:

 com.google.firebase:firebase-ads:15.0.1 

resuelto este problema para mí. Acabo de probarlo en Nexus 5X con 8.1.0 y los anuncios de AdMob intersticial funcionan ahora.

Una solución más completa:

build.gradle de la aplicación:

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

nivel superior build.gradle:

 buildscript { ... dependencies { ... classpath 'com.google.gms:google-services:3.3.0' ... } } ... 

EDITAR

Ahora hay disponible una versión admob más nueva. Confirmo que con la última versión el problema ya no aparece, por lo que puede usar la última versión de Admob

 implementation com.google.firebase:firebase-ads:15.0.1 

estableciendo la versión de destino a la última, si ha utilizado la solución sugerida anteriormente.

————————————————– ——–

Establezca el objective en el Nivel de la API de Android en 26 para solucionar el problema, esperando la actualización de Admob

En build.gradle

 targetSdkVersion 26 

si targetSdkVersion es> = 27 ( > android.os.Build.VERSION_CODES.O eso es 26) obtienes este error, ellos han cambiado ActivityRecord en la última versión de Android agregando esto:

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

El cambio se ha introducido en este compromiso

Evite que las actividades que no sean de pantalla completa influyan en la orientación Esta lista de cambios impone que las actividades que tengan como objective O y más allá solo pueden especificar una orientación si son de pantalla completa.

intenta agregar esto en tu manifiesto

  

O bien, si está utilizando appcompat:

  

Y en el manifiesto, asegúrese de que la actividad se declare con

 android:theme="@style/TranslucentTheme" 

Este problema se solucionará automáticamente cuando ad mob actualice sus anuncios sdk para API 27, su dependencia de anuncios no es compatible con API 27 por lo que este problema ocurre.

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

Solo las actividades de pantalla completa pueden solicitar orientación, esto se debe a los metadatos publicitarios en su archivo mainfest, admob debe actualizar su sdk para la versión 27. enter image description here

si ha configurado la versión sdk de destino 27, obtendrá este error, en realidad Android actualizando sdk muy rápido, y una actualización de admob para hacer, para la integración con sdk de Android, así que admob tiene pendiente esta actualización, deberían hacerlo muy pronto , No está en cuestión de desarrollador, si quiere escapar de este locking, configure su sdk en 26.

por favor no use ninguna propiedad en los archivos de manifiesto de Android AdActivity.

elimine esta línea de AdActivity en el archivo Manifiesto

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

Simplemente agregue la siguiente línea al archivo de manifiesto de Android.

   

En Android Oreo, no puedes cambiar la orientación por código para que tengas control siempre que cambies la orientación


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